perm filename DSKDMP.FAI[SS,SYS] blob
sn#855229 filedate 1988-03-29 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00023 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00007 00002 TYPXFR DEBSW DSKDSW EXTNEW CSAVE KLBOOT DSKDBG RHDSK FT1DSK KACODE NPACKS EXTNEW F A B C D E H J K L M P1 P2 P3 P4 T1 T2 T3 N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF DSTART DSTART CSVFIL KLEPT A%FP0 KLEPT R2WLSH RECSIZ RTLSIZ DATRPB RTLSIZ DATRPB WDPCHN DATSIZ BLKSIZ
C00016 00003 PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG BOOTBG XBUF XBUF BOOTBG BOOTBG XBUF NDATA BDATA KLEPT A%FP0
C00022 00004 C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK
C00027 00005 C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST
C00033 00006 MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ DPTRBP DPTEBP DPTRBP DPTEBP
C00038 00007 DMP file format
C00042 00008 LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NOMFD NODSKD NOSYS
C00050 00009 LOWEST DSKDMP RSXGO DSKD00 DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START AUTOGO Autoload LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF
C00066 00010 FILSET FILSE0 FILSE1 FILSIX FILSI1 RADJ RADJ1
C00071 00011 SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST RSTC1
C00082 00012 TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1 .DTTYO .DTMMN DTMTD DTMTI RSXTYI RSXTYO RSXMON
C00089 00013 C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN RCLTAB XBUF LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH PATCH1 LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFDEV DEFEXT DEFPPN AUTOBO RSXIO FDEV
C00097 00014 FDZBEG DIORG ICCW RH2CYL MAXUNI DSKTYP NUMCYL NUMSCL NUMSTK STRNAM RMXDRV DSKTAB FDZEND NDSKOP NDSKLZ RMXDRV PAGSIZ HOMNAM HOMSNM HOMLUN HOMHOM HOMRXB HOMSIZ HOMFSN HOMCOD HOMSLF CODHOM ICA ENTFLG MAXCHN MAXDRV RH0 .RHRAE .RHMBR .RHCTE .RHMBE .RHSTP .RHDON RHERR LR R4%CSR R4%CRC R4%RIP R4%CPA R4%CRD R4%DSR .RPERR .RPMOL .RPDRY R4%ATN R4%DST R4%DTR R4%TYP R4%DC .RHSBR .RHSTR RCLP STLW R4%TYP .R4TYP .R5TYP .R6TYP .R7TY2 .R7TY1 .R3TYP RHERR NRETRY TIMOUT R4%CRC R4%CDC R4%RIP R4%CPA R4%CRD N.SCL3 N.SCL4 N.SCL7 N.CLP3 N.CLP4 N.CLP6 N.CLP7 N.CLP6 N.CLP7 N.STK3 N.STK7 N.STK4 N.BKPG
C00109 00015 BLAST FDSK FDSK1 FDSK2 FDSK2A FDSK3 FDSK4 CHKSTR MISSTR MISUN2 MISUNI
C00116 00016 GOTDRV GOTDV3 GOTDV4 GOTDV0 GOTDV2
C00123 00017 RHREAD RHWRIT RHCONI RHCONO XIO1 RDDISK RD11 RD0 RD00 RD0A DOOP1 TYPGOO DOOP2 TYPFOO
C00133 00018 CHKHOM CHKHO2 BADUNI DPLUNI BADSTR BADUN2
C00137 00019 ARGLST DTELOD DTELD1 DTEERR DTELD2 DTELD3 DTELD4 DTLD4A DTLD4B DTLD4D DTLD4E DTLD4F DTLD4G DTLD4C DTELD5 RMGRNK RMGRN1 RMGRN2 LX11 LX11LN Loop ERROR DONG LD11 LDLP ST11 R0 R1 R2 R3 R4 R5 SP PC BIT15 BIT14 BIT13 BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DTEORG DTESIZ DLYCNT DEXWD3 DEXWD2 DEXWD1 TENAD1 PRTOFF DEPOSI TENAD2 TO10BC TO11BC TO10AD TO11AD DIAG1 DIAG2 DRESET STATUS TO11DB TO10DB TO11DN DEXDON TO11ER DIAG3 EPT143 . STBOOT 1$ Loop LOOP DISP ERROR DONG LD11 9$ 1$ EXAM DEXGO DEXWAT DEPO ERCMD CMDLST ST11 . ST11 1$ 2$
C00166 00020 >IFN RHDSK
C00167 00021 FF
C00168 00022 CSVNAM CSVLEN CS MKCSAV NODSK NOENT NOOUT
C00171 00023 END
C00172 ENDMK
C⊗;
;⊗ TYPXFR DEBSW DSKDSW EXTNEW CSAVE KLBOOT DSKDBG RHDSK FT1DSK KACODE NPACKS EXTNEW F A B C D E H J K L M P1 P2 P3 P4 T1 T2 T3 N T TT P HILOC NUFDWD RBO CUADR APR PI KLPAG CCA TTY C1A C1B DTE0 DTFLG DTF11 DTCMD DONG11 SWEEPB PIOFF DSTART DSTART CSVFIL KLEPT A%FP0 KLEPT R2WLSH RECSIZ RTLSIZ DATRPB RTLSIZ DATRPB WDPCHN DATSIZ BLKSIZ
;ASSEMBLY SWITCHES, TITLE AND AC DEFINITIONS
;"BOOT" means the program that's loaded into 11 memory that runs in response to
;the DS command in KLDCP.
;
;"DSKDMP" means the program that's run by BOOT. It generally has DDT and a
;file name scanner, etc.
;
;"CSAVE" is a file format generated by doing a REENTER into a DSKDMP core image
;from a WAITS job. The CSAVE file is converted to an 11-format file and put
;on the front-end 11's file system. From there it is loaded and started
;by the 11 to boot the system. CSAVE is hence a copy of DSKDMP run by the 11
;(on the 10) for booting.
;Switches for debugging.
TYPXFR←←0 ;Nonzero to type out a character for each disk xfer done OK
DEBSW←←0 ;If BOOT, 0 for paper tape, 1 for DECtape with EDDT
;If DSKDMP, 0 for real DSKDMP, 1 for DSKDMP with EDDT
;Switches actually used to select compilation results.
DSKDSW←←1 ;0 for BOOT, 1 for DSKDMP
EXTNEW←←3 ;If BOOT, 0 finds DSKDMP.DMP, 1 finds .NEW, 2 .OLD, 3 .TST
;Switches that are rarely changed.
CSAVE←←1 ;1 to include code at REENTER command to generate CSAVE boot file
KLBOOT←←1 ;If BOOT, 1 for KLDCP loadable BOOT, 0 for paper tape
DSKDBG←←1 ;1 for being able to load DSKDMP with EDDT, fixes symb tab ptr
RHDSK←←1 ;1 for RH20 disks, 0 for C1 channel disks
FT1DSK←←1 ;1 if all C1 disk packs are on same controller (not RHDSK)
KACODE←←0 ;1 to include run time checks for KA-10 and KASIM microcode
NPACKS←←8 ;number of disk drives on C1 channel
XALL ;suppress macro expansion in listing
DEFINE SWLIST <FOR SWITCH IN (CSAVE,TYPXFR,DEBSW,DSKDSW,DSKDBG,KLBOOT,RHDSK,FT1DSK,EXTNEW)>
DEFINE VALPNT (VAL) <
PRINTS /VAL/
>
PRINTS /SWITCHES ARE:
/
SWLIST <
PRINTS /SWITCH(/
VALPNT (\SWITCH)
PRINTS /) /
>
PRINTS /
/
repeat 0,<
PRINTS /Type new values for these symbols, if any, followed by CONTROL-META-LF
/
.INSERT TTY:
>;repeat 0
SWLIST <
IFDIF <SWITCH><EXTNEW><
IFN SWITCH,<↓SWITCH←←1>
IFE SWITCH,<↓SWITCH←←0>
>;IFDIF
>;SWLIST
IFL EXTNEW,<.FATAL EXTNEW has illegal value, must be 0, 1, 2 or 3.>
IFG EXTNEW-3,<.FATAL EXTNEW has illegal value, must be 0, 1, 2 or 3.>
↓EXTNEW←←EXTNEW
IFN DSKDSW,<KLBOOT←←0>
IFN KLBOOT,<
DEBSW ←← 0
DSKDBG ←← 0
CSAVE ←← 1
>;IFN KLBOOT
IFN DSKDSW,<
TITLE DSKDMP
>;IFN DSKDSW
IFE DSKDSW,<
IFE EXTNEW,< TITLE BOOT >
IFE EXTNEW-3,< TITLE TBOOT >
IFE EXTNEW-2,< TITLE OBOOT >
IFE EXTNEW-1,< TITLE NBOOT >
>;IFE DSKDSW
F←0
A←1
B←2
C←3
D←4
repeat 0,< ;unused
E←5
H←7
J←10
K←11
L←12
M←13
>;repeat 0
ifn rhdsk,<
P1←5
P2←6
P3←7
P4←10
T1←11
T2←12
T3←13
>;ifn rhdsk
N←14
T←15
TT←16
P←17
HILOC←←135
NUFDWD←←20
IFN DSKDSW,<
;RIGHT HALF F BITS
RBO←←1 ;DOING RUBOUT NOW
>;IFN DSKDSW
IFE RHDSK,<
↓CUADR←←6 ;CONTROL UNIT ADDRESS
>;IFE RHDSK
;Device codes
APR←←0
PI←←4
KLPAG←←10
CCA←←14
TTY←←120
IFE RHDSK,<
C1A←←140
C1B←←144
>;IFE RHDSK
DTE0←←200
;KL10 PARAMETERS, offsets within EPT
DTFLG←←444 ;DTE20 OPERATION COMPLETE FLAG
DTF11←←450 ; FROM 11 ARGUMENT
DTCMD←←451 ; TO 11 COMMAND
IFN KACODE,<
DEFINE SKPKA <CONSO TTY,1B28> ;SKIP IF THIS IS THE KA10
DEFINE SKPKL <CONSZ TTY,1B28> ;SKIP IF THIS IS THE KL10
>;IFN KACODE
IFE KACODE,<
;DEFINE SKPKA <CAI> ;SKIP IF THIS IS THE KA10 (never)
;DEFINE SKPKL <CAIA> ;SKIP IF THIS IS THE KL10 (always)
>;IFE KACODE
DONG11←←20000 ;DTE CONO BIT. REQUEST 11 INTERRUPT
SWEEPB←←200000 ;KL10 APR CONI BIT - SWEEP BUSY
PIOFF←←400
IFN DEBSW,<
LOC 74
JRST DDT↑
IFN DSKDSW,<
LOC 140
274
FF
LOWEST
>;IFN DSKDSW
LOC 300
JRST DDT
IFE DSKDSW,<
JRST BOOT
LOC 100000
>;IFE DSKDSW
IFN DSKDSW,<
JRST DSKDMP
LOC 500000 ;arbitrary I think, used to be 300000
>;IFN DSKDSW
DSTART::
>;IFN DEBSW
IFE DEBSW,<
IFN DSKDSW,<
DSTART←←760000 ;address where DSKDMP code will start
IFN CSAVE,<
LOC 124 ;REENTER command will generate a CSAVE boot file
MKCSAV ; which can be put in front-end's file system
>;IFN CSAVE
LOC 140
DSTART ;LOCATION FOR LOADING STARTING AT 274
FF ;FIRST FREE
LOWEST ;LOWEST LOCATION USED
IFN CSAVE,<
LOC 273
CSVFIL: IOWD CSVLEN,DSTART ;for 11 boot: nbr of words to load, where to start loading
>;IFN CSAVE
LOC 274
PHASE DSTART
>;IFN DSKDSW
>;IFE DEBSW
IFN RHDSK,<
IFE KLBOOT,<
KLEPT←<DSTART-2000>&777000 ;the KL EPT will be in the 2nd previous page
A%FP0←<DSTART-1000>&777000 ;and special disk buffer will follow KLEPT
>;IFE KLBOOT
>;IFN RHDSK
IFE RHDSK,<
KLEPT←←0
>;IFE RHDSK
R2WLSH←←7 ;amount to shift record count to make word count
RECSIZ←←<1⊗R2WLSH> ;size of a data record, in words
IFE RHDSK,<
RTLSIZ←←40 ;size of retrieval disk sector in words
DATRPB←←=18 ;data records per block
>;IFE RHDSK
IFN RHDSK,<
RTLSIZ←←200 ;size of retrieval disk sector in words
DATRPB←←=8 ;data records per block on RP07 (should get this from home blk)
WDPCHN←←4 ;number of words in logout area of a single RH20 channel
>;IFN RHDSK
DATSIZ←←DATRPB*RECSIZ ;size of disk block, not counting retrieval area
BLKSIZ←←DATSIZ+RTLSIZ ;size of disk block in words, incl retrieval area
;⊗ PTPC PTR PNCHGO GO1 GO2 PUNCHC PUNCH RIMLDR RIMLDL RIMPDL OBUF BOOTLO BOOTBG BOOTBG XBUF XBUF BOOTBG BOOTBG XBUF NDATA BDATA KLEPT A%FP0
;WRITE OUT RIM FORMAT BOOT, PNCHGO
IFE DSKDSW,<
IFE KLBOOT,<
IFE DEBSW,<
PTPC←←1
PTR←←104
LOC 200
PNCHGO: RESET
MOVE P,[-20,,RIMPDL]
INIT PTPC,13
SIXBIT /PTP/
OBUF,,
JRST 4,.
MOVSI C,-RIMLDL
GO1: MOVE A,RIMLDR(C)
PUSHJ P,PUNCH
AOBJN C,GO1
MOVEI D,0 ;INITIALIZE CHECKSUM
MOVE A,[BOOTBG,,BOOTBG]
PUSHJ P,PUNCHC
MOVSI C,BOOTBG
GO2: MOVE A,BOOTLO(C)
PUSHJ P,PUNCHC ;PUNCH AND CHECKSUM
AOBJN C,GO2
MOVE A,D
PUSHJ P,PUNCH ;PUNCH OUT CHECKSUM
MOVE A,[JRST BOOT]
PUSHJ P,PUNCH
MOVEI A,0
PUSHJ P,PUNCH
EXIT
PUNCHC: ROT D,1
ADD D,A
PUNCH: SOSG OBUF+2
OUT PTPC,
CAIA
JRST 4,.
IDPB A,OBUF+1
POPJ P,
RIMLDR: -17,,0 ;IOWD TO RIM LOADER
CONO PTR,60
HRRI 11,4
CONSO PTR,10
JRST 3
ROT 0,-2(11)
DATAI PTR,@10(11)
XCT 10(11)
XCT 13(11)
SOJA 11,0
CAME 0,17
ADD 0,(17)
SKIPL 17,0
JRST 4,1
AOBJN 17,3
JRST 2
RIMLDL←←.-RIMLDR
RIMPDL: BLOCK 20
OBUF: BLOCK 3
LIT
VAR
LOC 1000
BOOTLO:
IFE RHDSK,<
BOOTBG←←777000
>;IFE RHDSK
IFN RHDSK,<
BOOTBG←←775000 ;need more room for RH version
>;IFN RHDSK
PHASE BOOTBG
XBUF←←BOOTBG-BLKSIZ
>;IFE DEBSW
>;IFE KLBOOT
>;IFE DSKDSW
IFN DEBSW,<
IFE DSKDSW,<
XBUF: BLOCK BLKSIZ
>;IFE DSKDSW
>;IFN DEBSW
IFN KLBOOT,<
IFE DEBSW,<
IFE RHDSK,<
BOOTBG←←777000 ;CHANGE TO 777000 WHEN SOME MEMORY IS UP THERE
>;IFE RHDSK
IFN RHDSK,<
BOOTBG←←775000 ;need more room for RH version (allow room for symbols)
>;IFN RHDSK
LOC 140
BOOTBG
FF
LOWEST
LOC 274
PHASE BOOTBG
XBUF←←BOOTBG-BLKSIZ
>;IFE DEBSW
IFN RHDSK,<
NDATA←←100 ;max number of data words outside code loaded in KLDCP
BDATA←←XBUF-NDATA ;place where data area starts
KLEPT←<XBUF-NDATA-2000>&777000 ;the KL EPT will be in the 2nd page preceding XBUF
A%FP0←<XBUF-NDATA-1000>&777000 ;and special disk buffer will follow KLEPT
>;IFN RHDSK
.DATA←←BDATA ;initialize address to beginning of data area
DEFINE DATAWD(SYM,LEN)<
SYM←.DATA
.DATA←←.DATA+LEN ;allocate LEN words at SYM
IFG .DATA-BDATA-NDATA,<.FATAL Increase NDATA (data area size) and recompile>
>;DEFINE
>;IFN KLBOOT
;⊗ C1SBI C1RSI C1SRUN C1CONT C1SCH C1RST C1CCIF C1INTE C1INTD C1SCF1 C1CCF1 C1MPCN C1LCD C1LPT C1SYSR C1SCAN C1SDIA CIF CF1 CF2 C1UCHK
;C1 CHANNEL DEFINITIONS
IFE RHDSK,<
;CONO C1A BITS
C1SBI←←400000 ;SELECT BUS INTERFACE
C1RSI←←40000 ;RESET INTERFACE
C1SRUN←←10000 ;SET CLOCK RUN
C1CONT←←2000 ;CONTINUE CLOCK
C1SCH←←200000 ;SELECT CHANNEL
C1RST←←40000 ;RESET CHANNEL
C1CCIF←←20000 ;CLEAR CHANNEL INTERRUPT FLAG
C1INTE←←10000 ;INTERRUPT ENABLE
C1INTD←←4000 ;INTERRUPT DISABLE
C1SCF1←←2000 ;SET CF1
C1CCF1←←1000 ;CLEAR CF1
C1MPCN←←400 ;CONTINUE MICROPROCESSOR
C1LCD←←20 ;LOAD CODE FROM BITS 32-35
;BITS 32-35 ARE A CODE, BIT 32 IS OFF FOR "SOFTWARE" CODES:
C1LPT←←11 ;LOAD PROGRAM TABLE STARTING ADDRESS
C1SYSR←←2 ;SYSTEM RESET
C1SCAN←←7 ;SCAN PROGRAM TABLE FOR PROGRAMS TO START
C1SDIA←←100000 ;SELECT DIAGNOSTIC FUNCTIONS
;CONI C1A BITS
CIF←←4 ;CHANNEL INTERRUPT FLAG
CF1←←2 ;CHANNEL FLAG 1 (INTERRUPT THE Z80, SET FROM ICH IN CONO)
CF2←←1 ;CHANNEL FLAG 2 (Z80 READY FOR PROGRAM TABLE ADDRESS)
C1UCHK←←2 ;UNIT CHECK IN IBM STATUS BYTE
>;IFE RHDSK
;⊗ C1CMD C1MRT C1JMP C1TIO C1IWC C1BAK C1NATM C1BYTM C1CBYT C1SLE C1CEC C1NOC C1RPT C1CCW C1ISW C1PTPE C1PTNX C1IQF C1PPTR C1PCW C1BW C1STA C1HLT C1LE C1SE C1PE C1NXM C1BPE C1SSE C1PCMA C1STB C1STC C1INST
;C1 CHANNEL DATA AREA PARAMETERS
IFE RHDSK,<
;CHANNEL PROGRAM DEFINITIONS
;LEFT HALF BITS
C1CMD←←100000 ;BITS 0-3 = 10 MEANS (NON-MRT) COMMAND WORD
C1MRT←←040000 ;BITS 0-3 = 04 MEANS MRT COMMAND WORD
C1JMP←←200000 ;BITS 0-3 = 20 MEANS JUMP COMMAND WORD
C1TIO←←020000 ;TEST I/O
C1IWC←←010000 ;IGNORE WORD COUNT
C1BAK←←004000 ;BACKWARDS
C1NATM←←000000 ;NATURAL MODE (MODE IN BITS 7-8)
C1BYTM←←001000 ;BYTE MODE
C1CBYT←←000400 ;COUNT BYTES
;BITS 10-17 ARE THE IBM COMMAND BYTE
;RIGHT HALF BITS
C1SLE←←20 ;STOP ON LENGTH ERROR
C1CEC←←10 ;CHANNEL END CONTINUE
C1NOC←←2 ;NO CHAINING
C1RPT←←1 ;REPEAT UNTIL STATUS MODIFIER IS ON IN ENDING STATUS
;PROGRAM TABLE
C1CCW←←0 ;RELATIVE ADDRESS OF CHANNEL CONTROL WORD
C1ISW←←1 ;INTERRUPT SOURCE WORD
C1PTPE←←100000 ;PARITY ERROR IN PROGRAM TABLE
C1PTNX←←40000 ;NXM IN PROGRAM TABLE
C1IQF←←20000 ;INTERRUPT QUEUE FULL
C1PPTR←←2 ;FIRST PROGRAM POINTER
;PROGRAM HEADER AND PROGRAM
C1PCW←←0 ;RELATIVE ADDRESS OF PROGRAM CONTROL WORD
C1BW←←100 ;BUSY WAIT BIT IN PCW
C1STA←←1 ;STATUS A
;RIGHT HALF BITS
C1HLT←←400000 ;PROGRAM EXECUTED A HALT
C1LE←←200000 ;LENGTH ERROR
C1SE←←100000 ;SELECT ERROR
C1PE←←040000 ;PARITY ERROR
C1NXM←←020000 ;NXM
C1BPE←←010000 ;IBM BUS PARITY ERROR
C1SSE←←002000 ;SIGNAL SEQUENCE ERROR
;LEFT HALF BITS
C1PCMA←←100000 ;1→ERROR POINTER TO BY PC, 0→POINTED TO BY MA
C1STB←←2 ;STATUS B
C1STC←←3 ;STATUS C
C1INST←←4 ;FIRST INSTRUCTION OF CHANNEL PROGRAM
>;IFE RHDSK
;⊗ MFDLOC TRKCYL CYLPK TRKPK NXTQQQ A NXTQQQ NXTQQQ DPTRBP DPTEBP DPTRBP DPTEBP
;FILE SYSTEM PARAMETERS
IFE RHDSK,<
MFDLOC←←1 ;TRACK CONTAINING MFD
TRKCYL←←=19 ;19 HEADS PER CYLINDER
CYLPK←←=815 ;815 CYLINDERS PER PACK
TRKPK←←TRKCYL*CYLPK ;19*815=15485 TRACKS PER PACK
>;IFE RHDSK
;RETRIEVAL INFORMATION
NXTQQQ←←0
DEFINE ZWD (A) <
A←←NXTQQQ
NXTQQQ←←NXTQQQ+1
>
ZWD DDNAM ;FILE NAME
ZWD DDEXT ;FILE EXTENSION,,DATE WRITTEN,CREATION DATE
ZWD DDPRO ;PROTECTION,MODE,TIME,DATE WRITTEN
ZWD DDPPN ;PPN
ZWD DDLOC ;FIRST DISK ADDRESS OF THIS FILE
ZWD DDLNG ;LENGTH OF FILE IN WORDS
ZWD DREFTM
ZWD DDMPTM
ZWD DGRP1R ;FIRST USER RCRD NO. THIS GRP
ZWD DNXTGP ;BLOCK NUMBER OF NEXT GROUP
ZWD DSATID
ZWD DQINFO ;START OF SPECIAL STORAGE FOR LOGIN ETC.
NXTQQQ←←NXTQQQ+3
ZWD DOFFST ;RECORD OFFSET
ZWD DPTR ;RETRIEVAL DATA, 2 BLK NO.'S/WORD
IFE RHDSK,<
DPTRBP←←<POINT 18,DPTR> ;C1 disk format uses half-word retr ptrs
DPTEBP←←<POINT 18,RTLSIZ-1,35> ;byte ptr to last retr ptr
>;IFE RHDSK
IFN RHDSK,<
DPTRBP←←<POINT 36,DPTR> ;RH format uses full-word retr ptrs
DPTEBP←←<POINT 36,RTLSIZ-1,35> ;byte ptr to last retr ptr
>;IFN RHDSK
;DMP file format
COMMENT ⊗
DSKDMP.DMP[SS,SYS] IS AN ORDINARY DUMP FILE EXCEPT THAT IT HAS BEEN
ASSEMBLED WITH A PHASE STATEMENT AND EXPECTS TO BE LOADED HIGH IN
THE FIRST 256K OF CORE. LOCATION 140 OF THE CORE IMAGE THAT WOULD
HAVE BEEN OBTAINED BY LOADING DSKDMP CONTAINS THE STARTING ADDRESS
FOR LOADING. LOCATION 274 IS THE FIRST WORD THAT SHOULD BE LOADED
THERE. LOCATION 141 CONTAINS THE RELOCATED FIRST FREE ADDRESS, 142
CONTAINS THE RELOCATED LOWEST ADDRESS. THESE TWO LOCATIONS ARE USED
ONLY BY THE CNVRT PROGRAM TO MAKE DSKDMP.D10
⊗
;⊗ LOWEST BOOT BOOT1 BOOTL1 BOOTL2 BOOTL3 NOMFD NODSKD NOSYS
;BOOT BEGINS HERE
IFE DSKDSW,<
LOWEST←←.
BOOT: CONO APR,200000 ;RESET
SETZM KASIM
IFN RHDSK,<
CONO KLPAG,KLEPT⊗-9 ;TURN OFF CACHE. set EPT address. TURN OFF MAP
>;IFN RHDSK
IFN KACODE,<
BLKI APR,A ;GET UCODE OPTIONS INTO BITS 0-8 OF A
TLNE A,100000 ;SKIP UNLESS KA SIMULATION UCODE LOADED
SETOM KASIM
>;IFN KACODE
IFN KLBOOT,<
SETZB P1,BDATA ;Channel 0 to P1 for BLAST, set up for BLT
MOVE T1,[BDATA,,BDATA+1] ;Prepare to clear data area
BLT T1,BDATA+NDATA-1 ;Initialize data area to zero
>;IFN KLBOOT
MOVE P,[-LPDL,,PDL-1]
PUSHJ P,BLAST ;RESET THE CHANNEL or read the home blocks
IFN DSKDBG,<
SKIPE N,SYSLOC
JRST BOOT1
>;IFN DSKDBG
IFN RHDSK,<
SKIPN N,DIORG ;get location of the MFD
JRST NOMFD ;none
>;IFN RHDSK
IFE RHDSK,<
MOVEI N,MFDLOC
>;IFE RHDSK
MOVE A,[SIXBIT / SSSYS/]
PUSHJ P,SRCH ;LOOK FOR _SSSYS.UFD IN MFD
JRST NOSYS
MOVE N,3(TT) ;GET ADDRESS
IFN DSKDBG,<
MOVEM N,SYSLOC
>;IFN DSKDBG
BOOT1: MOVE A,[SIXBIT /DSKDMP/]
IFE EXTNEW,< MOVSI B,'DMP' >
IFE EXTNEW-1,< MOVSI B,'NEW' >
IFE EXTNEW-2,< MOVSI B,'OLD' >
IFE EXTNEW-3,< MOVSI B,'TST' >
PUSHJ P,SRCH1 ;LOOK FOR DSKDMP.DMP[SS,SYS]
JRST NODSKD
MOVE N,3(TT) ;GET DISK ADDRESS OF DSKDMP.DMP[SS,SYS]
MOVE T,[-<RTLSIZ+200>,,XBUF]
SETZM RECORD
PUSHJ P,READ0 ;READ RETRIEVAL AND ONE RECORD
MOVE A,XBUF+RTLSIZ+140-74 ;GET LOC 140 OF THE DUMP FILE
MOVE B,XBUF+DDLNG ;GET LENGTH OF DUMP FILE
IFN DSKDBG,<
MOVE C,XBUF+RTLSIZ+JOBSYM↑-74 ;GET POINTER TO SYMBOL TABLE
ADDI C,-274(A) ;RELOCATE IT
MOVEM C,SYMPNT
>;IFN DSKDBG
MOVE C,XBUF+RTLSIZ+JOBSA↑-74 ;GET STARTING ADDRESS
HRRZM C,STARTA
SUBI B,200
MOVEM B,LODCNT ;LENGTH OF REMAINDER OF DUMP FILE
MOVEM A,LODNXT ;STORE ADDRESS TO LOAD INTO
MOVEI B,2
MOVEM B,RECORD ;START AT RECORD 2
MOVE C,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM C,NXTTRK
MOVE T,LODCNT
CAILE T,DATSIZ-200
MOVEI T,DATSIZ-200
JRST BOOTL2
BOOTL1: MOVE T,LODCNT
MOVEI N,1
MOVEM N,RECORD
BOOTL2: ILDB N,NXTTRK
CAILE T,DATSIZ
MOVEI T,DATSIZ
MOVEM T,XFRCNT ;SAVE NUMBER OF WORDS THIS TRANSFER
MOVN T,T ;-NUMBER OF WORDS TO TRANSFER
HRLZ T,T
HRR T,LODNXT ;RH GETS NEXT LOC TO LOAD INTO
PUSHJ P,READ0 ;READ REST OF THIS TRACK
MOVE A,XFRCNT
ADDM A,LODNXT
MOVN A,A
ADDB A,LODCNT
IFN DSKDBG,<
JUMPLE A,BOOTL3 ;ALL DONE
>;IFN DSKDBG
IFE DSKDBG,<
JUMPLE A,@STARTA ;DONE, TRANSFER TO DSKDMP
>;IFE DSKDBG
MOVE A,NXTTRK
CAME A,[DPTEBP+XBUF] ;JUST DID LAST TRACK IN GROUP?
JRST BOOTL1 ;NO, DO NEXT TRACK
MOVE N,XBUF+DNXTGP ;FIRST TRACK OF NEXT GROUP
PUSHJ P,RDRET ;READ RETRIEVAL
MOVE A,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM A,NXTTRK
JRST BOOTL1
IFN DSKDBG,<
BOOTL3: SETOM 37
MOVE A,SYMPNT
MOVEM A,36
JRST @STARTA ;JUMP TO STARTING ADDRESS
>;IFN DSKDBG
NODSKD:
IFE KLBOOT,<
IFE EXTNEW,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.DMP[SS,SYS]/]] >
IFE EXTNEW-1,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.NEW[SS,SYS]/]] >
IFE EXTNEW-2,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.OLD[SS,SYS]/]] >
IFE EXTNEW-3,< SKIPA B,[[ASCIZ /CAN'T FIND DSKDMP.TST[SS,SYS]/]] >
>;IFE KLBOOT
IFN KLBOOT,<
IFE EXTNEW,< SKIPA B,[[ASCIZ /DMP?/]] >
IFE EXTNEW-1,< SKIPA B,[[ASCIZ /NEW?/]] >
IFE EXTNEW-2,< SKIPA B,[[ASCIZ /OLD?/]] >
IFE EXTNEW-3,< SKIPA B,[[ASCIZ /TST?/]] >
>;IFN KLBOOT
NOSYS:
IFE KLBOOT,<
MOVEI B,[ASCIZ /CAN'T FIND SSSYS.UFD[1,1]/]
>;IFE KLBOOT
IFN KLBOOT,<
MOVEI B,[ASCIZ /SS,SYS? /]
>;IFN KLBOOT
PUSHJ P,TYPE
JRST 4,.
IFN RHDSK,<
;Here if FDSK (called as BLAST) failed to find right disk structure.
;Original error message has already been typed out.
NOMFD:
IFE KLBOOT,<
MOVEI B,[ASCIZ/
Type RN to try again, looking for any structure.
/]
PUSHJ P,TYPE
>;IFE KLBOOT
JRST 4,.+1
SETZM FDEV ;set to accept any structure this time
JRST BOOT
>;IFN RHDSK
>;IFE DSKDSW
;⊗ LOWEST DSKDMP RSXGO DSKD00 DSKDM0 DSKDM1 DSKDM2 DSKDL DSKDL2 DSKDL1 DSKDRO DSKDAL DSKAL1 QQQ DSKDGO CMDS NCMDS CMDDSP SSTRTA SSTRT1 SSTRT2 START AUTOGO Autoload LOADGO NOMUCK MERGE LOAD LOADN LOADIT LDIT0 LDIT0A LDIT1 LDIT3 LDIT4 LDIT2 LDLP LDLP1 LDLP3 FILES DUMP KILL NSA FNF
IFN DSKDSW,<
;DSKDMP BEGINS HERE
;Start at 760000 for interactive I/O via KLDCP.
;Start at 760001 for autoboot of WAITS (I/O via KLDCP).
;Start at 760002 for interactive I/O via RSX.
;Start at 760003 for autoboot of WAITS (I/O via RSX).
LOWEST←←. ;first memory location loaded during bootstrapping
DSKDMP: JSP A,DSKD00 ;see startup offset meanings above
JSP A,DSKD00
RSXGO: JSP A,DSKD00
JSP A,DSKD00
DSKD00: JFCL FDZBEG ;insert a pointer to data area, for debugging
MOVEI A,-DSKDMP-1(A) ;get offset of 0 to 3
IFN CSAVE,<
MOVEI B,(A) ;copy offset
ANDI B,2 ;the second bit from right means KLDCP(0) or RSX(1)
MOVEM B,RSXIO ;set flag
>;IFN CSAVE
ANDI A,1 ;low-order bit means interactive(0) or autoboot(1)
MOVEM A,AUTOBO ;store autoboot flag
MOVE P,[-LPDL,,PDL-1]
CONO APR,200000
CONO PI,10000
IFN KACODE,<
SKPKL
JRST DSKDM1
>;IFN KACODE
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
CONSO KLPAG,600000 ;IS THE CACHE ON ALREADY?
JRST DSKDM0 ;NO.
BLKO CCA, ;VALIDATE CORE
CONSZ APR,SWEEPB
JRST .-1
DSKDM0:
IFN RHDSK,<
SETZM KLEPT ;clear the channel logout areas
MOVE A,[KLEPT,,KLEPT+1]
BLT A,KLEPT+MAXCHN*WDPCHN-1 ;clear all channels' logout areas
>;IFN RHDSK
CONO KLPAG,KLEPT⊗-9 ;TURN OFF CACHE. set EPT address. TURN OFF MAP
DATAI CCA,0 ;SWEEP CACHE. INVALIDATE ALL.
CONSZ APR,SWEEPB ;WAIT FOR SWEEP BUSY TO FALL
JRST .-1
IFN KACODE,<
BLKI APR,A ;GET UCODE OPTIONS INTO BITS 0-8 OF A
TLNN A,100000 ;SKIP IF KA SIMULATION UCODE LOADED
JRST DSKDM1
SETOM KASIM
CONO KLPAG,KLEPT⊗-9 ;MAKE SURE EPT IS AT right place
MOVEI C,411
PUSHJ P,DTEXX ;TELL KLDCP TO ENTER KASIM MODE
IFN RHDSK,<
PRINTX This can't possibly work, since EPT isn't where RH routines expect it
;and if EPT is at page 1000, we can't address it with straight-thru map.
>;IFN RHDSK
CONO KLPAG,1000 ;MOVE EPT TO PAGE 1000
PUSHJ P,BLAST ;init the C1 channel or read the RH home blocks
JRST DSKDM2
>;IFN KACODE
DSKDM1: PUSHJ P,BLAST ;init the C1 channel or read the RH home blocks
IFN CSAVE,<
SKIPE RSXIO ;skip unless doing RSX terminal I/O
PUSHJ P,RSXMON ;Put terminal into monitor mode for RSX
>;IFN CSAVE
SETZM KASIM
IFN KACODE,<
SKPKL
CONO TTY,3600 ;CLEAR ALL BUSY AND DONE FLAGS
SKIPN KASIM
>;IFN KACODE
SKIPA B,[SIXBIT / SSYS/]
DSKDM2: MOVE B,[SIXBIT / DSYS/];DIAGNOSTICS LIVE HERE
MOVEM B,DEFPPN
MOVEI F,0
MOVEI B,[ASCIZ /
DSKDMP/]
PUSHJ P,TYPE
IFN KACODE,<
SKIPN KASIM
JRST DSKDL
MOVEI B,[ASCIZ /
KA SIMULATION MICROCODE LOADED
SWITCHES = /]
PUSHJ P,TYPE
DATAI APR,B
PUSHJ P,OCTTYP
>;IFN KACODE
AOSN AUTOBO ;autoboot requested?
JRST AUTOGO ;yup, boot WAITS
DSKDL: MOVEI B,[ASCIZ /
*/]
PUSHJ P,TYPE
TRZ F,RBO
MOVEI B,0
DSKDL2: MOVE A,[010700,,TIBUF-1]
SETZM TIBUF
MOVE C,[TIBUF,,TIBUF+1]
BLT C,TIBUF+TIBFLN-1
DSKDL1: PUSHJ P,TYI ;GET CHARACTER IN C
CAIN C,177
JRST DSKDRO ;RUBOUT
TRZE F,RBO
JRST [ PUSH P,C
MOVEI C,"\"
PUSHJ P,TYO
POP P,C
PUSHJ P,TYO
CAIE C,15
JRST .+1
MOVEI C,12
PUSHJ P,TYO
MOVEI C,15
JRST .+1 ]
CAIN C,15
JRST DSKDGO
CAIN C,33
JRST DSKDAL ;ALT MODE
CAIN C,"U"-100
JRST DSKDL
IDPB C,A
JRST DSKDL1
DSKDRO: CAMN A,[010700,,TIBUF-1]
JRST DSKDL
MOVEI C,"\"
TRON F,RBO ;SET RUBOUT FLAG, SKIP IF ALREADY ON
PUSHJ P,TYO
LDB C,A
PUSHJ P,TYO
MOVEI C,0
DPB C,A
ADD A,[070000,,]
JUMPGE A,DSKDL1
SUB A,[430000,,1]
JRST DSKDL1
DSKDAL: LDB A,[POINT 7,TIBUF,6] ;GET FIRST CHARACTER
CAIL A,"0"
CAILE A,"9"
CAIA
JRST SSTRTA ;SET STARTING ADDRESS
MOVE A,TIBUF
MOVSI B,-NCMDS
DSKAL1: CAME A,CMDS(B)
AOBJN B,DSKAL1
JUMPL B,DSKDL2 ;JUMP IF FOUND ONE (B REMEMBERS THE COMMAND)
PUSHJ P,QQQ
JRST DSKDL
QQQ: MOVEI B,[ASCIZ / ???/]
JRST TYPE
DSKDGO: JUMPE B,LOADGO ;JUST FILE NAME
JRST @CMDDSP(B) ;DISPATCH ON COMMAND
CMDS: ASCII /L/ ;LOAD
ASCII /F/ ;LIST FILES
ASCII /D/ ;DUMP
ASCII /K/ ;KILL A FILE
ASCII /G/ ;START AT STARTING ADDRESS
ASCII /M/ ;MERGE (LOAD WITHOUT CLEAR)
ASCII /N/ ;LIKE L BUT DOESN'T HACK LOW CORE CELLS
NCMDS←←.-CMDS
CMDDSP: LOAD
FILES
DUMP
KILL
START
MERGE
NOMUCK
SSTRTA: MOVE A,[POINT 7,TIBUF]
MOVEI B,0
SSTRT1: ILDB C,A
CAIL C,"0"
CAILE C,"9"
JRST SSTRT2
LSH B,3
ADDI B,-"0"(C)
JRST SSTRT1
SSTRT2: MOVEM B,STARTA
JRST DSKDL
START: PUSHJ P,TWAIT ;WAIT FOR TTY TO FINISH
SKIPE STARTA
JRST @STARTA
MOVEI B,[ASCIZ /NO STARTING ADDRESS/]
PUSHJ P,TYPE
JRST DSKDL
;Here to automatically boot WAITS
AUTOGO: MOVEI B,[ASCIZ /
Autoload: WAITS
/]
PUSHJ P,TYPE ;tell operator we're loading WAITS
MOVE A,[ASCII/WAITS/] ;make us think user typed WAITS<cr>
MOVEM A,TIBUF
SETZM TIBUF+1 ;end input with null
;Here to load a file and start it
LOADGO: SETOM ZERFLG
SETOM MUCKFL
PUSHJ P,LOADIT
JRST DSKDL ;COULDN'T DO IT
MOVEI B,[ASCIZ / LOADED/]
PUSHJ P,TYPE
PUSHJ P,TWAIT
SKIPE STARTA
JRST @STARTA ;START IT UP
MOVEI B,[ASCIZ / BUT NO STARTING ADDRESS/]
PUSHJ P,TYPE
JRST DSKDL
NOMUCK: SETOM ZERFLG
SETZM MUCKFL
JRST LOADN
MERGE: SETZM ZERFLG
SETOM MUCKFL
JRST LOADN
LOAD: SETOM ZERFLG
SETOM MUCKFL
LOADN: PUSHJ P,LOADIT
JRST DSKDL ;COULDN'T DO IT
MOVEI B,[ASCIZ / LOADED/]
PUSHJ P,TYPE
JRST DSKDL
;SKIP RETURNS IF SUCCESSFUL
LOADIT: PUSHJ P,FILSET ;SET UP FILE NAME
SKIPN FNAM
JRST QQQ
IFN RHDSK,<
MOVE A,FDEV ;see what structure is requested
CAMN A,STRNAM ;skip if diff structure seen, need to scan disk
SKIPN DIORG ;skip if already have info for this structure
PUSHJ P,FDSK ;find desired structure on the disk
SKIPN N,DIORG ;get location of the MFD
JRST QQQ ;didn't find MFD, msg already typed, type ???
>;IFN RHDSK
IFE RHDSK,<
MOVEI N,MFDLOC
>;IFE RHDSK
MOVE A,FPPN
MOVEM A,DEFPPN
PUSHJ P,SRCH
JRST NSA ;UFD NOT FOUND IN MFD
MOVE N,3(TT) ;DISK ADDRESS OF UFD
MOVE A,FNAM
HLLZ B,FEXT
PUSHJ P,SRCH1
JRST FNF ;FILE NOT FOUND IN UFD
MOVE N,3(TT) ;DISK ADDRESS OF FILE
SKIPN ZERFLG
JRST LDIT0
SETZM 40
MOVE A,[40,,41]
IFE RHDSK,<
BLT A,DSKDMP-1 ;CLEAR CORE UP TO DSKDMP
>;IFE RHDSK
IFN RHDSK,<
BLT A,KLEPT-1 ;CLEAR CORE UP TO DSKDMP, preserve EPT
>;IFN RHDSK
LDIT0: MOVE T,[-<RTLSIZ+200>,,XBUF]
SETZM RECORD
PUSHJ P,READ0 ;READ RETRIEVAL AND ONE RECORD
SETZB C,FHILOC
SETZM STARTA
SKIPN MUCKFL ;SKIP IF MUCKING WITH LOW CORE CELLS
JRST LDIT0A
MOVE C,XBUF+RTLSIZ+JOBSYM↑-74 ;GET POINTER TO SYMBOL TABLE
MOVEM C,SYMPNT ;SAVE FOR LATER
MOVE C,XBUF+RTLSIZ+JOBSA↑-74 ;GET STARTING ADDRESS
HRRZM C,STARTA
MOVE C,XBUF+RTLSIZ+HILOC↑-74 ;ADDRESS OF BEGINNING OF UPPER
MOVEM C,FHILOC
LDIT0A: MOVE B,XBUF+DDLNG ;GET LENGTH OF DUMP FILE
JUMPE C,LDIT1 ;NO UPPER
MOVEI B,-74(C) ;FILE SIZE OF LOWER
SUBI C,1
IORI C,1777 ;LAST ADDRESS OF LOWER
CAIGE C,377777
MOVEI C,377777
ADDI C,1
MOVEM C,UPPRST ;UPPER STARTS HERE
LDIT1: MOVEM B,LODCNT
MOVEI A,74
MOVEM A,LODNXT ;STORE ADDRESS TO LOAD INTO
PUSHJ P,LDLP ;LOAD THE LOWER
SKIPN C,FHILOC ;SKIP IF THERE IS AN UPPER
JRST LDIT2 ;NO UPPER
MOVE B,XBUF+DDLNG
SUBI B,-74(C) ;COMPUTE SIZE OF UPPER
MOVEM B,LODCNT
MOVE B,UPPRST
MOVEM B,LODNXT ;STARTING CORE ADDRESS OF UPPER
MOVE A,RECORD ;NEXT RECORD TO READ IS FIRST REC OF UPPER
CAIN A,DATRPB+1
JRST LDIT3 ;UPPER BEGINS ON A TRACK BOUNDARY
MOVN T,A
ADDI T,DATRPB+1 ;NUMBER OF RECORDS LEFT IN TRACK
IMULI T,200 ;NUMBER OF WORDS LEFT IN TRACK
CAMLE T,LODCNT
MOVE T,LODCNT
LDB N,NXTTRK
PUSHJ P,LDLP3
JRST LDIT2
LDIT3: MOVE A,NXTTRK
CAME A,[DPTEBP+XBUF] ;JUST DID LAST TRACK IN GROUP?
JRST LDIT4
MOVE N,XBUF+DNXTGP
PUSHJ P,RDRET ;READ RETRIEVAL OF NEXT GROUP
MOVE A,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM A,NXTTRK
LDIT4: PUSHJ P,LDLP1 ;LOAD THE UPPER
LDIT2: MOVEI A,-1
MOVEM A,37
MOVE A,SYMPNT
IFN KACODE,<
SKIPE KASIM
MOVEI A,116 ;PDP-6 DDT EXPECTS 36 TO POINT TO SYM PTR
>;IFN KACODE
MOVEM A,36
JRST CPOPJ1
;SET LODNXT TO FIRST LOCATION TO LOAD INTO, LODCNT TO NUMBER OF WORDS TO TRANSFER
;STARTS READING AT THE BEGINNING OF THE GROUP WHOSE RETRIEVAL IS IN XBUF
LDLP: MOVE C,[DPTRBP+XBUF] ;set up byte ptr to retr ptrs
MOVEM C,NXTTRK
LDLP1: MOVE T,LODCNT
MOVEI N,1
MOVEM N,RECORD
ILDB N,NXTTRK
LDLP3: CAILE T,DATSIZ
MOVEI T,DATSIZ
MOVEM T,XFRCNT ;SAVE NUMBER OF WORDS THIS TRANSFER
MOVN T,T ;-NUMBER OF WORDS TO TRANSFER
HRLZ T,T
HRR T,LODNXT ;RH GETS NEXT LOC TO LOAD INTO
PUSHJ P,READ0 ;READ THE TRACK
MOVE A,XFRCNT
ADDM A,LODNXT
MOVN A,A
ADDB A,LODCNT
JUMPLE A,CPOPJ ;DONE
MOVE A,NXTTRK
CAME A,[DPTEBP+XBUF] ;JUST DID LAST TRACK IN GROUP?
JRST LDLP1 ;NO, DO NEXT TRACK
MOVE N,XBUF+DNXTGP ;FIRST TRACK OF NEXT GROUP
PUSHJ P,RDRET ;READ RETRIEVAL
JRST LDLP
FILES: MOVEI B,[ASCIZ /FILES COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
DUMP: MOVEI B,[ASCIZ /DUMP COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
KILL: MOVEI B,[ASCIZ /KILL COMMAND NOT IMPLEMENTED YET/]
PUSHJ P,TYPE
JRST DSKDL
NSA: MOVEI B,[ASCIZ /NO SUCH AREA - /]
PUSHJ P,TYPE
JRST PPNTYP
FNF: MOVEI B,[ASCIZ /NO SUCH FILE - /]
PUSHJ P,TYPE
JRST FILTYP
;⊗ FILSET FILSE0 FILSE1 FILSIX FILSI1 RADJ RADJ1
;SCAN TIBUF AND SET UP FILE NAME, EXTENSION AND PPN
FILSET:
IFN RHDSK,<
MOVE B,DEFDEV ;set up default structure name (device)
MOVEM B,FDEV
>;IFN RHDSK
MOVE B,DEFPPN
MOVEM B,FPPN
MOVE B,DEFEXT
MOVEM B,FEXT
SETZM FNAM
SETZM FEXT+1
MOVE A,[010700,,TIBUF-1]
PUSHJ P,FILSIX
IFN RHDSK,<
CAIE D,":" ;device given?
JRST FILSE0 ;no, must be filename
MOVEM B,FDEV ;yes, store device name
PUSHJ P,FILSIX ;now read filename
FILSE0:
>;IFN RHDSK
MOVEM B,FNAM
CAIE D,"."
JRST FILSE1
PUSHJ P,FILSIX
HLLZM B,FEXT
FILSE1: CAIE D,"["
POPJ P,
PUSHJ P,FILSIX
PUSHJ P,RADJ
HLLM B,FPPN
CAIE D,","
POPJ P,
PUSHJ P,FILSIX
PUSHJ P,RADJ
HLRM B,FPPN
POPJ P,
FILSIX: MOVEI B,0
MOVE C,[440600,,B]
FILSI1: ILDB D,A ;GET NEXT CHARACTER FROM BUFFER
CAIE D,"."
CAIN D,"["
POPJ P,
CAIE D,","
CAIN D,"]"
POPJ P,
IFN RHDSK,<
CAIN D,":" ;see structure name?
POPJ P, ;yes
>;IFN RHDSK
JUMPE D,CPOPJ
SUBI D,40
TLNE C,770000
IDPB D,C
JRST FILSI1
RADJ: JUMPE B,CPOPJ
RADJ1: TLNE B,77
POPJ P,
LSH B,-6
JRST RADJ1
>;IFN DSKDSW
;⊗ SRCH SRCH1 SRCH2 SRCH3 SRCHLP SRCH5 SRCH4 RDRET READ READ0 READC1 C1WAIT C1WAIA C1WAIB C1WERR C1DIE C1MPIL C1MPI1 C1SET BLAST RSTC1
;SRCH IS GIVEN A FILENAME IN A AND A block IN N.
;SRCH1 IS GIVEN A FILENAME IN A, AN EXTENSION IN B AND A block IN N
SRCH: MOVSI B,'UFD'
SRCH1: PUSHJ P,READ ;READ block N INTO XBUF
SKIPN T,DDLNG+XBUF ;GET FILE LENGTH
POPJ P,
MOVE TT,[DPTRBP+XBUF] ;set up byte ptr to get retr ptrs
IBP TT ;prepare to get second retr ptr (skip first)
MOVEM TT,NXTTRK
SRCH2: MOVE TT,[-DATSIZ,,XBUF+RTLSIZ] ;scan block starting beyond retrieval
SRCH3: HLLZ C,1(TT) ;get file extension
CAMN A,(TT)
CAME B,C
JRST SRCHLP ;not the file we want
JRST CPOPJ1 ;RETURN WITH POINTER IN TT
SRCHLP: SUBI T,NUFDWD ;one less UFD entry left
JUMPLE T,CPOPJ ;jump if no more data in UFD, file not found
ADD TT,[NUFDWD-1,,NUFDWD-1] ;advance to next UFD entry
AOBJN TT,SRCH3 ;jump if more UFD entries
MOVE TT,NXTTRK ;get byte ptr to next block
CAMN TT,[DPTEBP+XBUF] ;JUST DID LAST block IN GROUP?
JRST SRCH4 ;YES, get next group
ILDB N,NXTTRK ;no, get next block within group
SRCH5: PUSH P,T ;SAVE COUNT OF WORDS LEFT TO SEARCH
PUSHJ P,READ ;READ IN THE NEXT block
POP P,T
JRST SRCH2 ;go search the new block
SRCH4: MOVE N,DNXTGP+XBUF ;NUMBER OF FIRST block of NEXT GROUP
MOVE TT,[DPTRBP+XBUF] ;set up byte ptr to get retr ptrs
IBP TT ;prepare to get second retr ptr (skip first)
MOVEM TT,NXTTRK
JRST SRCH5
;RDRET READS RETRIEVAL OF block WHOSE ADDRESS IS IN N
;READ READS ENTIRE block WHOSE ADDRESS IS IN N
RDRET: SKIPA T,[-RTLSIZ,,XBUF] ;read retrieval only into this buffer
READ: MOVE T,[-BLKSIZ,,XBUF] ;read whole block into this buffer
SETZM RECORD ;START READING AT RECORD ZERO within block
READ0:
IFN RHDSK,<
MOVEI TT,(T) ;memory address of transfer
DPB TT,[POINT 22,ICCW,35] ;store physical address (same as virtual addr)
HLRE TT,T ;get negative word count
MOVN TT,TT ;positive word count
CAILE TT,3777 ;max word count for one CCW
JRST 4,. ;word count wouldn't have fit in CCW
DPB TT,[POINT 11,ICCW,13] ;store word count for channel
MOVE T,N ;get record number of transfer
ADD T,RECORD ;add in record offset within WAITS block
IDIV T,HOMSIZ ;record number within unit to TT, logical unit to T
CAMLE T,MAXUNI ;make sure valid unit number
JRST 4,. ;unit number out of range
LDB P1,[POINT 17,DSKTAB(T),17] ;get physical channel number for log. unit
HRRZ P2,DSKTAB(T) ;get physical drive number of logical unit
MOVE T,TT ;record nbr within unit
IDIV T,NUMSCL ;rec nbr within cyl to TT, cyl to T
PUSH P,T ;save cyl
MOVE T,TT ;rec nbr within cyl
IDIV T,NUMSTK ;sector within track to TT, track to T
MOVE P4,TT ;sector in low bits
LSH T,=35-=27 ;move track (head) number to end in bit 27
IOR P4,T ;combine head and sector
IOR P4,[.RHSBR!LR] ;For RH20 SBAR
POP P,T1 ;get back cyl
JRST RDDISK ;tell the channel to do the transfer
>;IFN RHDSK
IFE RHDSK,<
READC1: PUSHJ P,C1MPIL ;HERE WITH WCMA IN T, COMPILE INTO MRT INST
PUSH P,T ;SAVE RECORD NUMBER RETURNED BY C1MPIL
SETZM C1ERR ;CLEAR ERROR COUNT
PUSH P,N+1 ;save AC N+1
IDIVI N,TRKPK ;N←PACK, N+1←TRACK ON PACK
EXCH N+1,(P) ;restore N+1, save track on pack
POP P,T ;T←track on pack
IDIVI T,TRKCYL ;T←CYLINDER, TT←HEAD
DPB T,[POINT 16,C1CCHR,15] ;C C
DPB TT,[POINT 8,C1CCHR,23] ;H
MOVE TT,RECORD
POP P,RECORD
DPB TT,[POINT 8,C1CCHR,31] ;R
MOVE TT,C1WCHN(N) ;GET CHANNEL NUMBER
DPB N,[POINT 4,@C1PPTP(TT),12] ;STORE DISK DRIVE ADDRESS
MOVEI N,4
DPB N,[POINT 5,@C1PPTP(TT),4] ;STORE START CODE
C1WAIT: JUMPN TT,C1WAIB
CONSO C1A,CIF
JRST .-1
MOVEI T,0
EXCH T,C1APT+C1ISW
C1WAIA: TLC T,200000
TLNE T,600000
JRST C1WERR
MOVE T,C1PH+C1STA ;STATUS A WORD
TRNN T,C1HLT
JRST C1WERR
XCT C1CIFI(TT) ;CLEAR INT FLAG
POPJ P,
C1WAIB: CONSO C1B,CIF
JRST .-1
MOVEI T,0
EXCH T,C1BPT+C1ISW
JRST C1WAIA
C1WERR: AOS T,C1ERR
CAIL T,=10
JRST C1DIE
PUSHJ P,BLAST ;re-initialize the C1 channel
MOVEI T,4
DPB T,[POINT 5,@C1PPTP(TT),4] ;START C1 AGAIN
JRST C1WAIT
C1DIE: MOVEI B,[ASCIZ /C1 ERRORS
/]
PUSHJ P,TYPE
JRST 4,.
C1MPIL: PUSH P,A ;HERE WITH WCMA IN T, 1ST RECORD # IN RECORD
PUSH P,B
PUSH P,C
MOVE A,[-=21,,C1MRTD-1] ;PUSH DOWN POINTER FOR DATA POINTERS
MOVE B,RECORD
C1MPI1: HRLZ C,RCLTAB(B) ;GET SIZE OF RECORD
LSH C,4
HRR C,T
TLO C,600000 ;MARK AS DATA PNTR AND 1ST OF THE RECORD
PUSH A,C
ADD T,RCLTAB(B)
ADDI B,1 ;ADVANCE RECORD NUMBER
JUMPL T,C1MPI1
MOVE T,B ;RETURN NEXT RECORD NUMBER IN T
PUSH A,[0]
POP P,C
POP P,B
POP P,A
POPJ P,
C1SET: SETZM C1ZERO
MOVE A,[C1ZERO,,C1ZERO+1]
BLT A,C1ZEND-1
MOVEI A,253
MOVEM A,C1APT+C1CCW
MOVEM A,C1BPT+C1CCW
MOVEI A,C1BW ;BUSY WAIT BIT
MOVEM A,C1PH
MOVE A,[C1JMP,,C1MRTC]
MOVEM A,C1PH+C1INST
MOVE A,[<BYTE (5)37 (8)CUADR⊗4>!C1PH]
MOVEM A,C1APT+C1PPTR
MOVE A,[<BYTE (5)37 (8)<CUADR+1>⊗4>!C1PH]
MOVEM A,C1BPT+C1PPTR
POPJ P,
;See FDSK for the IFN RHDSK version of BLAST; this is the IFE RHDSK version.
BLAST:
;RESET C1 CHANNELS
RSTC1: AOSN C1FRST
PUSHJ P,C1SET ;SET UP C1 DATA AREAS ONCE ONLY
CONO C1A,C1SBI!C1RSI!C1SRUN!C1CONT ;RESET ALL CHANNELS START CLOCK
CONO C1A,C1SCH!C1RST!C1MPCN ;RESET CHAN A AND START UP
CONO C1B,C1SCH!C1RST!C1MPCN ;RESET CHAN B AND START UP
CONO C1A,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1A TO DO A SYSTEM RESET
MOVEI A,100000
CONSZ C1A,CF1 ;WAIT FOR IT TO DROP CF1
SOJG A,.-1
CONO C1B,C1SCH!C1SCF1!C1LCD!C1SYSR ;TELL C1B TOO
MOVEI A,100000
CONSZ C1B,CF1
SOJG A,.-1
CONO C1A,C1SCH!C1SCF1!C1LCD!C1LPT ;INT THE CHANNEL FOR LD ...
CONO C1B,C1SCH!C1SCF1!C1LCD!C1LPT ;...PGM TABLE.
MOVEI A,100000
CONSO C1A,CF2 ;WAIT FOR CHANNEL TO BE READY FOR PGM TBL
SOJG A,.-1
DATAO C1A,C1PTP ;TELL IT WHERE THE PROGRAM TABLE IS
CONO C1A,C1SCH!C1CCF1 ;CLEAR CF1 (TELL IT WE'VE TOLD IT)
MOVEI A,100000
CONSZ C1A,CF2 ;WAIT FOR CHANNEL TO DROP CF2
SOJG A,.-1
MOVEI A,100000
CONSO C1B,CF2 ;REPEAT FOR SECOND CHANNEL
SOJG A,.-1
DATAO C1B,C1PTP+1
CONO C1B,C1SCH!C1CCF1
MOVEI A,100000
CONSZ C1B,CF2
SOJG A,.-1
POPJ P,
>;IFE RHDSK
;⊗ TYPE TYPE1 TYO CPOPJ1 CPOPJ DTEXX KLTYO KLTYI TYI KLTYI1 POPCJ TYICAN FILTYP PPNTYP TYPSIX TYPSI1 TWAIT OCTTYP OCTTY1 .DTTYO .DTMMN DTMTD DTMTI RSXTYI RSXTYO RSXMON
TYPE: HRLI B,440700
TYPE1: ILDB C,B
JUMPE C,CPOPJ
PUSHJ P,TYO
JRST TYPE1
TYO: PUSH P,C
CAIN C,33
MOVEI C,"$"
IFN KACODE,<
SKPKA
SKIPE KASIM
CAIA
>;IFN KACODE
JRST KLTYO
IFN KACODE,<
CONSZ TTY,20
JRST .-1
DATAO TTY,C
POP P,C
POPJ P,
>;IFN KACODE
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
DTEXX: MOVEM C,KLEPT+DTCMD
SETZM KLEPT+DTFLG ;CLEAR 11'S RESPONSE FLAG
CONO DTE0,DONG11 ;RING FOR 11
SKIPN KLEPT+DTFLG ;WAIT FOR RESPONSE
JRST .-1
MOVE C,KLEPT+DTF11 ;GET 11'S RESPONSE WORD
POPJ P,
KLTYO: ANDI C,177
IFN CSAVE,<
SKIPE RSXIO ;skip unless doing RSX terminal I/O
JRST RSXTYO ;do output via RSX
>;IFN CSAVE
PUSHJ P,DTEXX
POP P,C
POPJ P,
IFN DSKDSW,<
KLTYI:
IFN CSAVE,<
SKIPE RSXIO ;skip unless doing RSX terminal I/O
JRST RSXTYI ;do input via RSX
>;IFN CSAVE
MOVEI C,3400
PUSHJ P,DTEXX
JUMPE C,KLTYI
JRST KLTYI1
TYI:
IFN KACODE,<
SKPKA
SKIPE KASIM
CAIA
>;IFN KACODE
JRST KLTYI
IFN KACODE,<
CONSO TTY,40
JRST .-1
DATAI TTY,C
>;IFN KACODE
KLTYI1: ANDI C,177 ;FLUSH PARITY BIT
CAIL C,"a"
CAILE C,"z"
CAIA
SUBI C,40 ;make upper case
CAIE C,176
CAIN C,175
MOVEI C,33
CAIN C,12
MOVEI C,15
CAIN C,"U"-100
JRST TYICAN
TRNE F,RBO ;SKIP UNLESS RUBBING OUT
POPJ P, ;DON'T ECHO HERE IF RUBBING OUT
PUSH P,C
PUSHJ P,TYO
CAIE C,15
JRST POPCJ
MOVEI C,12
PUSHJ P,TYO
POPCJ: POP P,C
POPJ P,
TYICAN: MOVEI C,"↑"
PUSHJ P,TYO
MOVEI C,"U"
PUSHJ P,TYO
MOVEI C,"U"-100
TRZ F,RBO
POPJ P,
FILTYP:
IFN RHDSK,<
MOVE D,FDEV
PUSHJ P,TYPSIX
MOVEI C,":"
PUSHJ P,TYO
>;IFN RHDSK
MOVE D,FNAM
PUSHJ P,TYPSIX
MOVEI C,"."
SKIPN D,FEXT
JRST PPNTYP
PUSHJ P,TYO
PUSHJ P,TYPSIX
PPNTYP: MOVEI C,"["
PUSHJ P,TYO
HLLZ D,FPPN
PUSHJ P,TYPSIX
MOVEI C,","
PUSHJ P,TYO
HRLZ D,FPPN
PUSHJ P,TYPSIX
MOVEI C,"]"
JRST TYO
TYPSIX: MOVEI C,0
LSHC C,6
JUMPE C,TYPSI1
ADDI C,40
PUSHJ P,TYO
TYPSI1: JUMPN D,TYPSIX
POPJ P,
TWAIT:
IFN KACODE,<
SKPKA
SKIPE KASIM
CAIA
POPJ P,
CONSZ TTY,20
JRST TWAIT
>;IFN KACODE
POPJ P,
OCTTYP: IDIVI B,10
JUMPE B,OCTTY1
HRLM C,(P)
PUSHJ P,OCTTYP
HLRZ C,(P)
OCTTY1: ADDI C,"0"
JRST TYO
;KL10 console routines for communicating with RSX.
IFN CSAVE,<
.DTTYO==10B27 ;FUNCTION CODE FOR TYPE OUT, CHAR IN LOW BITS
.DTMMN==11B27 ;FUNCTION CODE FOR MONITOR MODE ON
;EPT LOCS
;DTEFLG=A%EPT+444 ;OPERATION COMPLETE FLAG
;DTEF11=A%EPT+450 ;PDP11 TO PDP10 ARGUMENT
;DTECMD=A%EPT+451 ;-10 TO -11 COMMAND WORD
;DTEMTD==A%EPT+455 ;MONITOR OUTPUT DONE WHEN NONZERO
;DTEMTI==A%EPT+456 ;0 IF READY FOR ANOTHER CHAR FROM 11
;EPT LOCS
DTMTD==455 ;MONITOR OUTPUT DONE WHEN NONZERO
DTMTI==456 ;0 IF READY FOR ANOTHER CHAR FROM 11
;RSXTYI - Read terminal input from RSX on 11.
;Reads the character into C.
RSXTYI: SKIPN KLEPT+DTMTI ;INPUT READY
JRST RSXTYI ;NO - LOOP
MOVE C,KLEPT+DTF11 ;GET CHAR
SETZM KLEPT+DTMTI ;RESET INPUT DONE FLAG
JUMPE C,RSXTYI ;ignore nulls
JRST KLTYI1 ;do special input processing and echo char
;Terminal output via RSX on 11.
;Here with output character in C.
RSXTYO: TRO C,.DTTYO ;LIGHT FUNCTION BI
SETZM KLEPT+DTMTD ;CLEAR OUTPUT DONE FLAG
MOVEM C,KLEPT+DTCMD ;STORE FOR 11
CONO DTE0,DONG11 ;RING FOR 11
SKIPN KLEPT+DTMTD ;DONE YET?
JRST .-1 ;NO
POP P,C
POPJ P, ;YES
;Set monitor mode before we do any terminal I/O.
RSXMON: SETZM KLEPT+DTMTI ;no input for us yet
SETZM KLEPT+DTFLG ;not done yet
MOVEI C,.DTMMN ;request monitor mode on
MOVEM C,KLEPT+DTCMD ;STORE FOR 11
CONO DTE0,DONG11 ;RING FOR 11
SKIPN KLEPT+DTFLG ;DONE YET?
JRST .-1 ;NO
POPJ P,
>;IFN CSAVE
>;IFN DSKDSW
;⊗ C1ZERO C1APT C1BPT C1PH C1ZEND C1FRST C1ERR C1PTP C1PPTP C1CIFI ZZZ C1MRTC C1CCHR C1MRTD C1WCHN RCLTAB XBUF LPDL PDL ERRCNT RECORD NXTTRK SYMPNT SYSLOC PATCH PATCH1 LODCNT LODNXT XFRCNT STARTA KASIM MUCKFL ZERFLG FHILOC UPPRST TIBFLN TIBUF FNAM FEXT FPPN DEFDEV DEFEXT DEFPPN AUTOBO RSXIO FDEV
;DISK ADDRESSES AND POINTERS
IFE RHDSK,<
C1ZERO:: ;ZERO FROM HERE TO C1ZEND AT DISKUP
C1APT: BLOCK C1PPTR+1+1 ;CHN CTL WD, INT WD, PGM PTR, END MARK
C1BPT: BLOCK C1PPTR+1+1 ;PROGRAM TABLE FOR SECOND CHANNEL
C1PH: BLOCK C1INST ;PROGRAM HEADER
0 ;JUMP TO PROGRAM
C1ZEND::
C1FRST: -1 ;-1 FIRST TIME THROUGH
C1ERR: 0 ;ERROR COUNT
C1PTP: C1APT ;POINTERS TO PRG TABLES INDEXED BY CHANNEL NUMBER
C1BPT
C1PPTP: C1APT+C1PPTR
C1BPT+C1PPTR
C1CIFI: CONO C1A,C1SCH!C1CCIF ;INST TO CLEAR CIF INDEXED BY CHANNEL NUMBER
CONO C1B,C1SCH!C1CCIF
;WCMAS FOR CONTROL COMMANDS
DEFINE C1WCMA (COUNT,ADDR,REC)<
ZZZ←←0
IFIDN <REC><R><ZZZ←←1>
BYTE (1)1 (1)ZZZ (13)COUNT (22)ADDR
>
C1MRTC: C1MRT!C1NATM!6,,0 ;MRT READ COMMAND
C1CCHR: BYTE (8)0,0,0,0 ;C C H R
BYTE (8)0,DATRPB+1-1,0,0 ;SECTOR, LAST REC, WRAP REC, 0
C1JMP,,C1MRTD ;JUMP TO 1ST DATA POINTER
C1MRTD: BLOCK DATRPB+1
0
'C1WCHN' ;FOR AIDING LOCATING OF THIS TABLE IN CORE FROM DDT
;TABLE OF WHICH DRIVE IS ON WHICH CHANNEL, 0 FOR C1A, 1 FOR C1B
C1WCHN:
IFN FT1DSK,<
1
1
1
1
1
1
1
1
>;IFN FT1DSK
IFE FT1DSK,<
0
1
0
1
0
1
0
1
>;IFE FT1DSK
IFN .-C1WCHN-NPACKS,<.FATAL GUESS WHAT YOU FORGOT TO CHANGE>
RCLTAB: RTLSIZ,,RTLSIZ
REPEAT DATRPB,<
200,,200
>
>;IFE RHDSK
IFN DSKDSW,<
XBUF: BLOCK BLKSIZ
>;IFN DSKDSW
LPDL←←20
IFE KLBOOT,<
PDL: BLOCK LPDL
ERRCNT: 0
RECORD: 0
NXTTRK: 0 ;BYTE POINTER TO DPTR
SYMPNT: 0 ;SYMBOL TABLE POINTER FROM DSKDMP.DMP
IFN DSKDBG,<
SYSLOC: 0 ;DISK ADDRESS OF SSSYS.UFD[1,1]
>;IFN DSKDBG
IFN DSKDSW,<
PATCH: BLOCK 40
PATCH1: BLOCK 40
>;IFN DSKDSW
LODCNT: 0 ;NUMBER OF WORDS IN FILE LEFT TO LOAD
LODNXT: 0 ;NEXT ADDRESS TO LOAD INTO
XFRCNT: 0 ;NUMBER OF WORDS THIS TRANSFER
STARTA: 0 ;DSKDMP'S STARTING ADDRESS
KASIM: 0 ;-1 IF KA SIMULATION UCODE IS RUNNING
>;IFE KLBOOT
IFN DSKDSW,<
MUCKFL: 0 ;-1 IF MUCKING AROUND WITH LOW CORE CELLS
ZERFLG: 0 ;-1 TO ZERO CORE FIRST
FHILOC: 0 ;HILOC OF FILE WE ARE LOADING
UPPRST: 0 ;CORE ADDRESS OF START OF UPPER
TIBFLN←←20
TIBUF: BLOCK TIBFLN
FNAM: 0
FEXT: 0
0
FPPN: 0
IFN RHDSK,<
DEFDEV: SIXBIT /RSK/ ;default structure (DSKDMP)
>;IFN RHDSK
DEFEXT: SIXBIT /DMP/ ;DEFAULT EXTENSION
DEFPPN: SIXBIT / SSYS/ ;DEFAULT PPN
AUTOBO: 0 ;nonzero (from starting at DSTART+2) means autoboot WAITS
IFN CSAVE,<
RSXIO: 0 ;nonzero if CTY I/O is via RSX, otherwise via KLDCP
>;IFN CSAVE
>;IFN DSKDSW
IFN RHDSK,<
FDEV: SIXBIT /RSK/ ;default (and only) structure for BOOT, stru for DSKDMP
>;IFN RHDSK
IFN KLBOOT,<
DATAWD(PDL,LPDL)
DATAWD(ERRCNT,1)
DATAWD(RECORD,1)
DATAWD(NXTTRK,1) ;BYTE POINTER TO DPTR
DATAWD(SYMPNT,1) ;SYMBOL TABLE POINTER FROM DSKDMP.DMP
DATAWD(LODCNT,1) ;NUMBER OF WORDS IN FILE LEFT TO LOAD
DATAWD(LODNXT,1) ;NEXT ADDRESS TO LOAD INTO
DATAWD(XFRCNT,1) ;NUMBER OF WORDS THIS TRANSFER
DATAWD(STARTA,1) ;DSKDMP'S STARTING ADDRESS
DATAWD(KASIM,1) ;-1 IF KA SIMULATION UCODE IS RUNNING
>;IFN KLBOOT
;⊗ FDZBEG DIORG ICCW RH2CYL MAXUNI DSKTYP NUMCYL NUMSCL NUMSTK STRNAM RMXDRV DSKTAB FDZEND NDSKOP NDSKLZ RMXDRV PAGSIZ HOMNAM HOMSNM HOMLUN HOMHOM HOMRXB HOMSIZ HOMFSN HOMCOD HOMSLF CODHOM ICA ENTFLG MAXCHN MAXDRV RH0 .RHRAE .RHMBR .RHCTE .RHMBE .RHSTP .RHDON RHERR LR R4%CSR R4%CRC R4%RIP R4%CPA R4%CRD R4%DSR .RPERR .RPMOL .RPDRY R4%ATN R4%DST R4%DTR R4%TYP R4%DC .RHSBR .RHSTR RCLP STLW R4%TYP .R4TYP .R5TYP .R6TYP .R7TY2 .R7TY1 .R3TYP RHERR NRETRY TIMOUT R4%CRC R4%CDC R4%RIP R4%CPA R4%CRD N.SCL3 N.SCL4 N.SCL7 N.CLP3 N.CLP4 N.CLP6 N.CLP7 N.CLP6 N.CLP7 N.STK3 N.STK7 N.STK4 N.BKPG
IFN RHDSK,<
OPDEF CALL [PUSHJ P,]
OPDEF RET [POPJ P,]
;General assumptions
; Register use:
; P1 Holds the physical channel number 0 ≤ channel < MAXCHN (8)
; P2 Holds the physical unit number 0 ≤ unit < MAXDRV (8)
;(>> matching brackets)
IFE KLBOOT,<
;Data storage
FDZBEG←←. ;start of area initialized to zero by FDSK
DIORG: 0 ;Set up by FDSK with the location of the MFD, from HOMXRB
ICCW: 0 ;Set to a Channel Command Word for transfer
0 ;halt CCW
RH2CYL: 0 ;desired cylinder
MAXUNI: 0 ;Maximum unit number of the structure that was found.
;(This is one less than the number of units in structure.)
DSKTYP: 0 ;Initially zero, the Drive Type of the units in this str.
NUMCYL: 0 ;Number of cylinders/unit for this drive type
NUMSCL: 0 ;Number of sectors/cylinder for this drive type
NUMSTK: 0 ;Number of sectors/track for this drive type
STRNAM: 0 ;Name of structure represented by DIORG and DSKTAB
RMXDRV←←20 ;max number of drives we're prepared to handle
DSKTAB: BLOCK RMXDRV ;Table we set up with one word per drive, indexed
;by logical drive number. Each word will contain:
; 400000!<physical channel>,,<physical unit>
FDZEND←←.-1 ;end of area initialized to zero by FDSK
NDSKOP: 0 ;counts all diskops, successful or not
NDSKLZ: 0 ;counts losing diskops
>;IFE KLBOOT
IFN KLBOOT,<
;Data storage
;FDZBEG←←. ;start of area initialized to zero by FDSK
DATAWD(DIORG,1) ;Set up by FDSK with the location of the MFD, from HOMXRB
DATAWD(ICCW,2) ;Set to a Channel Command Word for transfer, 2nd word is halt
DATAWD(RH2CYL,1);desired cylinder
DATAWD(MAXUNI,1);Maximum unit number of the structure that was found.
;(This is one less than the number of units in structure.)
DATAWD(DSKTYP,1);Initially zero, the Drive Type of the units in this str.
DATAWD(NUMCYL,1);Number of cylinders/unit for this drive type
DATAWD(NUMSCL,1);Number of sectors/cylinder for this drive type
DATAWD(NUMSTK,1);Number of sectors/track for this drive type
DATAWD(STRNAM,1);Name of structure represented by DIORG and DSKTAB
RMXDRV←←20 ;max number of drives we're prepared to handle
DATAWD(DSKTAB,RMXDRV) ;Table we set up with one word per drive, indexed
;by logical drive number. Each word will contain:
; 400000!<physical channel>,,<physical unit>
;FDZEND←←.-1 ;end of area initialized to zero by FDSK
DATAWD(NDSKOP,1);counts all diskops, successful or not
DATAWD(NDSKLZ,1);counts losing diskops
>;IFN KLBOOT
PAGSIZ←←1000 ;words per page
;A%FP0 is defined as the page after KLEPT and is a
;one page data buffer. Home block is read into
;second record of this page. The following
;definitions of home block words are used:
;HOME BLOCK DEFINITIONS
HOMNAM←←A%FP0+200+0 ;SIXBIT /HOM/
HOMSNM←A%FP0+200+3 ;SIXBIT /STRUCTURE NAME/
HOMLUN←A%FP0+200+4 ;XWD TOTAL PACKS, LOGICAL PACK #
HOMHOM←A%FP0+200+5 ;BLOCK # OF OTHER HOME BLK,, BLK # OF THIS HB
HOMRXB←A%FP0+200+10 ;ADR OF INDEX BLOCK OF ROOT DIRECTORY (MFD on WAITS)
HOMSIZ←A%FP0+200+13 ;SIZE OF A UNIT IN SECTORS (records)
HOMFSN←A%FP0+200+173 ;FILE SYSTEM TYPE
HOMCOD←A%FP0+200+176 ;0 ,, CODHOM
HOMSLF←A%FP0+200+177 ;THIS HOME BLOCK #
CODHOM←←707070 ;the special code to mark home blocks
;Constants
ICA←←0 ;Offset from EPT origin to channel 0's Logout area
ENTFLG←←400000 ;Flag in left half of DSKTAB table used to
;distinguish channel 0 unit 0 from a missing entry
MAXCHN←←8 ;maximum number of channels
MAXDRV←←8 ;maximum number of drives per channel
;Device Definitions
; RH20
RH0←←540 ;device number
; RH20 CONO/CONI
.RHRAE←←1B24 ;Clear RAE (In CONI, Register Access Err)
.RHMBR←←1B25 ;Clear RH20 & attached Devices
.RHCTE←←1B26 ;Clear transfer error
.RHMBE←←1B27 ;Enable Massbus Transmitters (also CONI)
.RHSTP←←1B31 ;Stop a hung transfer
.RHDON←←1B32 ;Clear Done (In CONI, Transfer Done)
RHERR←←775120 ;All the RH20 error bits (in CONI)
;Data Bus Parity; Drive Exception
;Long WC; Whort WC; Channel Error
;Drive Response Error; RAE; Overrun
;and Either Command Buffer Full
; RH20 DATAO/DATAI
LR←←1B6 ;Load Register Bit
; RP06 Registers
R4%CSR←←0B5 ;Drive Command Register
; RP06 Drive Commands
R4%CRC←←07 ;Recalibrate
R4%RIP←←21 ;Read-in Preset
R4%CPA←←23 ;Pack Acknowledge
R4%CRD←←71 ;Read Data
R4%DSR←←1B5 ;Drive Status Register
.RPERR←←1B21 ;Composite error
.RPMOL←←1B23 ;Medium On-Line
.RPDRY←←1B28 ;Drive Ready
R4%ATN←←4B5 ;Attention Summary Register
R4%DST←←5B5 ;Drive Sector & Track
R4%DTR←←6B5 ;Drive Type Register
R4%TYP←←777 ;Mask for drive type bits only
R4%DC←←12B5 ;Cylinder Register
.RHSBR←←70B5 ;RH20 Secondary Block Address Reg
.RHSTR←←71B5 ;RH20 Secondary Transfer Control Reg
RCLP←←1B7 ;Reset Command List Pointer
STLW←←1B10 ;Store Ending Status
R4%TYP←←777B35 ;DEVICE TYPE FIELD IN TYPE REGISTER
.R4TYP←←20 ;RP04 DEVICE TYPE CODE
.R5TYP←←21 ;RP05 DEVICE TYPE CODE
.R6TYP←←22 ;RP06 DEVICE TYPE CODE
.R7TY2←←41 ;RP07 DEVICE TYPE CODE (moving head?)
.R7TY1←←42 ;RP07 DEVICE TYPE CODE (fixed head?) (our kind)
.R3TYP←←24 ;RM03 DEVICE TYPE CODE
RHERR←←775120 ;RH10 CONI ERROR BITS
NRETRY←←5 ;NUMBER OF TIMES TO RETRY
TIMOUT←←=50000 ;COUNT FOR SOJG TIMEOUT
repeat 0,<
;R4%CSK←←02B34 ;RP04 SEEK FUNCTION
R4%CRC←←03B34 ;RE-CALIBRATE FUNCTION IN CONTROL REGISTER
R4%CDC←←04B34 ;RP04 DRIVE CLEAR FUNCTION
R4%RIP←←10B34 ;READ-IN PRESET FUNCTION
R4%CPA←←11B34 ;PACK ACKNOWLEDGE FUNCTION IN CONTROL REGISTER
;R4%CWR←←30B34 ;RP04 WRITE FUNCTION
R4%CRD←←34B34 ;RP04 READ FUNCTION
>;repeat 0
N.SCL3←←=148 ;SECTORS PER CYL (RM03)
;IFE BOOT06,<
;N.SCL4←←=380 ;SECTORS PER CYL (RP04/RP05/RP06)
;>;IFE BOOT06
N.SCL4←←=340 ;used SECTORS PER CYL, for RP07 BOOT usage
N.SCL7←←=1376 ;SECTORS PER CYL RP07
N.CLP3←←=820 ;CYLS PER UNI (RM03)
N.CLP4←←=400 ;CYLS PER UNI (RP04/5)
repeat 0,<
N.CLP6←←=800 ;CYLS PER UNI (RP06)
N.CLP7←←=629 ;CYLS PER UNI (RP07)
>;repeat 0
N.CLP6←←=815 ;CYLS PER UNI (RP06)
N.CLP7←←=630 ;CYLS PER UNI (RP07)
N.STK3←←=30 ;SECTORS PER TRACK (RM03)
N.STK7←←=43 ;SECTORS PER TRACK (RP07)
;IFE BOOT06,<
;N.STK4←←=20 ;SECTORS PER TRACK (RP04) (and 05/06?)
;>;IFE BOOT06
N.STK4←←=18 ;used SECTORS PER TRACK, for RP07 BOOT usage
N.BKPG←←4 ;number of records per page
;⊗ BLAST FDSK FDSK1 FDSK2 FDSK2A FDSK3 FDSK4 CHKSTR MISSTR MISUN2 MISUNI
;Routine to locate the physical units for a given structure (FDEV).
;Sets up DSKTAB and DIORG if successful.
;Types error msg if appropriate.
BLAST::
FDSK:
IFE KLBOOT,<
SETZB P1,FDZBEG ;Channel 0 to P1, set up for BLT
MOVE T1,[FDZBEG,,FDZBEG+1] ;Prepare to clear data area
BLT T1,FDZEND ;Initialize data area to zero
>;IFE KLBOOT
SETOM MAXUNI ;No highest unit in structure
;; MAP T1,A%FP0 ;Convert addr of FP0 to physical
;; TLZ T1,777760 ;Keep the 22 physical addr bits
MOVEI T1,A%FP0 ;set up physical address of buffer (mapping is off)
TLO T1,(<1B0+1B1+<1000B13>>) ;CCW: Data, Halt, Word Count = 1 page
MOVEM T1,ICCW ;Store first data CCW
;Examine the channel whose number is in P1
FDSK1: MOVEI T1,.RHMBR ;RH20 Reset function
CALL RHCONO ;Reset the RH20
MOVEI T1,.RHMBE ;RH20 Enable function
CALL RHCONO ;Enable Massbus transmitters
CALL RHCONI ;Now read RH CONI, result to T1
TRNN T1,.RHMBE ;Did the enable bit come back?
JRST FDSK4 ;No. No bit means no channel.
;This channel exists.
;; MAP T1,ICCW ;Get physical address of ICCW
;; TLZ T1,777760 ;Keep 22 phys addr bits
MOVEI T1,ICCW ;set up physical address of CCW list (map is off)
TLO T1,(<1B1>) ;Make a JUMP CCW
MOVE T2,P1 ;Get the current channel number
LSH T2,2 ;Shift it to Channel*4
MOVEM T1,KLEPT+ICA(T2) ;Store initial CCW for channel
;Scan to see what physical units are present.
MOVEI P2,0 ;Start at unit 0
;Start on a Unit. Unit number in P2
FDSK2: MOVSI T1,(<R4%DTR>) ;Read the Drive Type register
CALL RHREAD ;Read it
MOVE T2,T1 ;Copy Drive Type to T2
CALL RHCONI ;Check for Register Access Error
TRNN T1,.RHRAE ;Test CONI bits for RAE
JRST FDSK2A ;All is well: a drive responded
MOVEI T1,.RHRAE!.RHMBE ;Must clear RAE. Set ENABLE.
CALL RHCONO ;CONO to clear RAE & set ENABLE
JRST FDSK3 ;Drive doesn't exist. Try next.
;A unit is present. See what kind of drive it is. GOTDRV does the real work.
FDSK2A: CALL GOTDRV ;See what we have here
FDSK3: CAIGE P2,MAXDRV-1 ;Done with all units yet?
AOJA P2,FDSK2 ;No, go do next unit now.
FDSK4: CAIGE P1,MAXCHN-1 ;Checked all channels yet?
AOJA P1,FDSK1 ;No, advance to next channel
;Now see if we found a consistent structure.
SKIPGE T1,MAXUNI ;Now, check for full structure
JRST MISSTR ;Structure not found
CHKSTR: SKIPN DSKTAB(T1) ;Any physical addr for this LUN?
JRST MISUNI ;Bad structure: missing unit
SOJGE T1,CHKSTR ;Loop thru all units
MOVE T2,DSKTYP ;Get the type of this disk
MOVE T1,[N.STK4,,N.SCL4] ;Get sec/trk,,sectors/cylinders for 04, 05, 06
CAIN T2,.R3TYP ;RP03?
MOVE T1,[N.STK3,,N.SCL3] ;Yes
CAIN T2,.R7TY1 ;RP07?
MOVE T1,[N.STK7,,N.SCL7] ;Yes
HRRZM T1,NUMSCL ;Save sec/cyl
HLRZM T1,NUMSTK ;Save sec/trk
RET ;all done with FDSK
MISSTR:
IFE KLBOOT,<
MOVEI B,[ASCIZ/Desired structure not found. /]
>;IFE KLBOOT
IFN KLBOOT,<
MOVEI B,[ASCIZ/Struct? /]
>;IFN KLBOOT
MISUN2:
IFN DSKDSW,<
PUSHJ P,TYPE ;type error msg
SKIPN D,FDEV
MOVE D,['-ANY-'] ;indicate blank structure name, which matches any
JRST TYPSIX ;type device name
>;IFN DSKDSW
IFE DSKDSW,<
JRST TYPE ;type error msg and return
>;IFE DSKDSW
MISUNI:
IFE KLBOOT,<
MOVEI B,[ASCIZ/Structure has unit(s) missing. /]
>;IFE KLBOOT
IFN KLBOOT,<
MOVEI B,[ASCIZ/Units? /]
>;IFN KLBOOT
SETZM DIORG ;don't let us try to use this structure
JRST MISUN2 ;type error msg and return
;⊗ GOTDRV GOTDV3 GOTDV4 GOTDV0 GOTDV2
SUBTTL GOTDRV Examine the Drive and HHome Block to see if we want it
;Initially DSKTYP is zero. When we find the first disk, we set DSKTYP to the
;negative of the drive type number. If we like the home blocks, we set
;DSKTYP to positive and thereafter, we look at only physical units that are
;similar.
GOTDRV: ANDI T2,R4%TYP ;Keep only the device type code
CAIN T2,.R5TYP ;Is this an RP05?
MOVEI T2,.R4TYP ;Yes, make it look like an RP04
IFE KLBOOT,< ;squeeze into KLDCP
CAIN T2,.R7TY2 ;Alternate kind of RP07?
MOVEI T2,.R7TY1 ;Make it the usual kind of RP07
>;IFE KLBOOT
SKIPG T1,DSKTYP ;Are we looking for a specific disk?
JRST GOTDV3 ;Not yet, check if this is allowable
CAMN T2,T1 ;Yes. Is this the same as we want?
JRST GOTDV0 ;Same as we want. Read its home block.
RET ;No. Don't use this one.
;The desired Drive Type has not been selected yet. Check type against all known
;disk types:
GOTDV3: CAIE T2,.R7TY1 ;RP07?
CAIN T2,.R3TYP ;or RM03?
JRST GOTDV4 ;Yes
CAIE T2,.R6TYP ;RP06
CAIN T2,.R4TYP ;or RP04?
JRST GOTDV4 ;Yes. Save type (negated)
RET ;This is no kind of disk for us
GOTDV4: MOVNM T2,DSKTYP ;Save negative drive type till home blocks checked
GOTDV0: MOVE T1,[R4%CSR!LR!R4%CPA] ;Send Pack Acknowledge.
CALL RHWRIT ;Do DATAO. Sets Volume Valid
MOVSI T1,(<R4%DSR>) ;Read device status register
CALL RHREAD ;Via DATAO/DATAI
TRNN T1,.RPMOL ;Is Disk Pack On-Line?
RET ;No. Forget it.
SETZM A%FP0 ;Clear data page
MOVE T1,[A%FP0,,A%FP0+1] ;Set up for the BLT
BLT T1,A%FP0+PAGSIZ-1 ;Zero data page before the Read
CALL RD0 ;Read disk page 0 (records 0,1,2,3)
CALL CHKHOM ;Check the home block
JRST GOTDV2 ;Bad. Try the Backup home block
RET ;Good block, but wrong Structure
MOVMS DSKTYP ;Good block, right structure, set DSKTYP positive
RET
;Primary Home Block was bad. Try reading the Backup home block.
;CHKHOM expects to see the home block in record 1 (words 200:377) of the page.
;So we position the backup home block in record 1 of the page, by starting
;the transfer at record 11. Then record 12 will wind up at words 200:377
GOTDV2: CALL RD11 ;Read records 11,12,13,14
CALL CHKHOM ;Check the backup home block
RET ;Error
RET ;Wrong structure
MOVMS DSKTYP ;OK, set DSKTYP positive.
RET
;⊗ RHREAD RHWRIT RHCONI RHCONO XIO1 RDDISK RD11 RD0 RD00 RD0A DOOP1 TYPGOO DOOP2 TYPFOO
;RH20 Register Read and Write, CONO and CONI. Call with P1 = RH #
;An RH20 register is read by DATAO'ing the specified register number to the RH
;and then DATAI'ing the RH. An RH20 register is written by DATAO'ing the
;specified register number, the LR (load register) bit, and the remainder of
;the data to the RH. After writing the register, a DATAI is performed to
;read the new contents.
RHREAD: TLZ T1,(<LR>) ;Clear LR bit
RHWRIT: TSO T1,P2 ;Insert Drive Number in left half
CALL XIO1 ;Set IO Device Field & do DATAO
DATAO .-.,T1 ;Send register select & data to device
CALL XIO1 ;Set IO Device Field & do DATAI
DATAI .-.,T1 ;Read selected register
RET
RHCONI: CALL XIO1 ;Set IO device and do CONI
CONI .-.,T1 ;Read device status
RET
RHCONO: CALL XIO1 ;Set IO device and do CONO
CONO .-.,(T1) ;Set device conditions
RET
;XIO1 Subroutine
; Call with P1 = channel number
; next instruction should be: IOOP 0,Address
;
; Effect of routine is to execute the specified I/O instruction as
; though its device code field were set for the given channel number.
XIO1: PUSH P,@(P) ;Fetch argument, to top of stack
AOS -1(P) ;Skip once to skip over the argument
PUSH P,T3 ;Save AC T3
MOVEI T3,<RH0/4>(P1) ;Produce I/O device code
DPB T3,[POINT 7,-1(P),9] ;Store IO Device Number in instruction
POP P,T3 ;Restore AC
XCT (P) ;Execute the target instruction
CAIA ;Target didn't skip
AOS -1(P) ;Target skipped. Pass the Skip upwards.
ADJSP P,-1 ;Discard the stacked instruction
RET
;RD0: Routine to read page 0 (Records 0,1*,2,3) *=home block
;RD11: Routine to read back home block (Records 11,12*,13,14)
;
; Accepts in P1/ Channel number
; P2/ Unit number
; ICCW/ Channel command word (memory address and length of xfer in words)
; CALL RD0
;
;RDDISK: above args plus:
; T1/ Cylinder number
; P4/ Position word
;Enter here with cylinder number in T1
RDDISK: MOVEM T1,RH2CYL ;save cylinder number till we need it
MOVEI T3,NRETRY ;Initialize Retry counter
JRST RD0A ;Join RD0 but avoid recalibrate
RD11: SKIPA P4,[.RHSBR!LR!0B27!11B35] ;Desired Sector and track
RD0: MOVE P4,[.RHSBR!LR!0B27!0B35] ;For RH20 SBAR
SETZM RH2CYL ;select cylinder 0
MOVEI T3,NRETRY ;Initialize Retry counter
;This is where we come to retry losing disk ops, starting with a recalibrate.
RD00: MOVE T1,[R4%CSR!LR!R4%CRC] ;Recalibrate function
CALL RHWRIT ;Execute Recalibrate
RD0A: MOVSI T1,(<R4%DSR>) ;Select unit status register
CALL RHREAD ;Get drive status
TRNN T1,.RPDRY ;Is drive ready?
JRST RD0A ;No, wait till recalibrate done
MOVE T1,[R4%CSR!LR!R4%RIP] ;Read-in Preset Function
CALL RHWRIT ;Execute read-in preset
SETZM ICCW+1 ;End command list with a HALT
MOVE P3,[.RHSTR!LR!RCLP!STLW!R4%CRD] ;Write a disk READ cmd into the STCR
LDB T1,[POINT 11,ICCW,13] ;get word count from CCW
ADDI T1,RECSIZ-1 ;round up to whole sectors
LSH T1,-R2WLSH ;shift count to make it a sector count
MOVN T1,T1 ;negative sector count
DPB T1,[POINT 10,P3,29] ;put negative sector count in disk READ cmd
;Do a data transfer operation with disk
; Accepts in P3/ DATAO Data ;Data Xfer command for STCR
; P1/ Channel number
; P2/ Unit number
; P4/ Position select word ;For the SBAR
; RH2CYL/ Desired cylinder
HRRZ T1,RH2CYL ;get desired cylinder number
TLO T1,(LR!R4%DC) ;set up DATAO word to select cylinder
CALL RHWRIT ;Write DC, selecting desired cylinder
MOVE T1,P4 ;Get Block Address Word
CALL RHWRIT ;Write it to SBAR
MOVE T1,P3 ;Get the TCR word
CALL RHWRIT ;Write STCR. Start Xfer.
MOVEI T2,TIMOUT ;Get timeout count
DOOP1: CALL RHCONI ;Get RH status
TRNN T1,.RHDON ;RH done? Is operation done?
SOJG T2,DOOP1 ;No. Loop till done or timeout
MOVE P3,T1 ;Copy final CONI (unused??)
MOVEI T1,.RHRAE!.RHCTE!.RHMBE!.RHDON ;Clear Done and errors
CALL RHCONO ;Via CONO to RH
JUMPLE T2,DOOP2 ;Did operation ever finish?
MOVSI T1,(<R4%DSR>) ;Yes. Read disk status
CALL RHREAD ;Get device status
TRNE T1,.RPERR ;Check composite error flag
JRST DOOP2 ;Some drive-detected error
CALL RHCONI ;Get RH status bits
IFE KLBOOT,< ;squeeze into KLDCP
AOS NDSKOP ;count disk ops, successful or not
>;IFE KLBOOT
IFE TYPXFR,<
TRNN T1,RHERR ;Any errors there?
RET ;No errors. Return.
>;IFE TYPXFR
IFN TYPXFR,<
TRNE T1,RHERR ;Any errors there?
JRST DOOP2 ;Yes, try again
MOVEI C,"+" ;indicate successful disk op
MOVE T3,NDSKOP ;get disk op count
SUB T3,NDSKLZ ;only count winners, discount losers
TYPGOO: TRNN T3,000000 ;patch this to limit dot typeout to every 2↑Nth op
PUSHJ P,TYO ;type char for each successful disk op
RET ;No errors. Return.
>;IFN TYPXFR
DOOP2: MOVEI T1,.RHMBR!.RHMBE!.RHCTE!.RHSTP ;Here if errors. Setup CONO:
CALL RHCONO ;Massbus Reset and Enable bits
MOVEI T1,.RHMBE ;Get Massbus Enable
CALL RHCONO ;Enable Channel
MOVE T1,[R4%ATN!LR!377] ;Select Attention Register
CALL RHWRIT ;Clear Attention in all drives
IFE KLBOOT,< ;squeeze into KLDCP
AOS T1,NDSKLZ ;count losing disk ops
>;IFE KLBOOT
IFN TYPXFR,<
MOVEI C,"-" ;indicate losing disk op
TYPFOO: TRNN T1,000000 ;patch this to limit typeout to every 2↑Nth error
PUSHJ P,TYO ;type char for each losing disk op
>;IFN TYPXFR
SOJG T3,RD00 ;Repeat failing operation
RET ;Catch errors elsewhere
;⊗ CHKHOM CHKHO2 BADUNI DPLUNI BADSTR BADUN2
;Check for correct home blocks
; no skip: bad home block
; one skip: wrong structure
; two skips: OK
CHKHOM: MOVS T1,HOMNAM ;Get block name
CAIE T1,'HOM' ;Does it say SIXBIT/HOM/ ?
RET ;Bad.
MOVE T1,HOMCOD ;Get block type code
CAIE T1,CODHOM ;Check it (707070)
RET ;Bad home block
MOVE T1,HOMFSN ;Get file system type, chars 1-4
CAME T1,[BYTE (2)0(8)" "," "(2)0(8)"A","W"]
RET ;Not a WAITS pack
MOVE T1,HOMFSN+1 ;Get characters 5-8 of type
MOVE T2,HOMFSN+2 ;Get characters 9-12 of type
CAMN T1,[BYTE (2)0(8)"T","I"(2)0(8)" ","S"]
CAME T2,[BYTE (2)0(8)" "," "(2)0(8)" "," "]
RET ;Not a WAITS pack
AOS (P) ;At least one skip now.
MOVE T1,HOMSNM ;Get Structure name
SKIPN T2,FDEV ;skip if specific structure requested
JUMPN T1,CHKHO2 ;take any structure with Non-Blank name!
CAME T1,T2 ;Does it match what we want?
RET ;Wrong Structure (one skip)
CHKHO2: SKIPN STRNAM ;Have we identified structure yet?
MOVEM T1,STRNAM ;No, save name of structure found
CAME T1,STRNAM ;Part of same structure already seen?
RET ;No, wrong Structure
HRRZ T1,HOMLUN ;Get logical unit number
CAIL T1,RMXDRV ;Make sure it's in range
JRST BADUNI ;Out of range!
SKIPE DSKTAB(T1) ;Is this unit number defined?
JRST DPLUNI ;Yes. Bad: Duplicate units
HRRZM P2,DSKTAB(T1) ;Store Physical Unit number
MOVEI T2,ENTFLG(P1) ;Phys Channel + entry-used flag
HRLM T2,DSKTAB(T1) ;Store phys channel + flag
HLRZ T1,HOMLUN ;Get number of units in str
SOS T1 ;Convert to maximum unit #
SKIPGE MAXUNI ;Is MAXUNI already set?
MOVEM T1,MAXUNI ;No: set it now.
CAME T1,MAXUNI ;Is this unit the same as others?
JRST BADSTR
MOVE T2,HOMRXB ;Get MFD address
SKIPN DIORG ;Is MFD addr already set?
MOVEM T2,DIORG ;No. Set it.
CAME T2,DIORG ;Must be same as any previous
JRST BADSTR ;But it isn't. Bad: home blocks are inconsistent
JRST CPOPJ1 ;Another skip. A good pack
IFE KLBOOT,<
BADUNI: MOVEI B,[ASCIZ/Unit number out of range./]
JRST BADUN2
DPLUNI: MOVEI B,[ASCIZ/Different drives claim same logical unit number./]
JRST BADUN2
BADSTR: MOVEI B,[ASCIZ/Inconsistent home blocks on different drives./]
>;IFE KLBOOT
IFN KLBOOT,<
BADUNI:
DPLUNI:
BADSTR: MOVEI B,[ASCIZ/CHKHOM? /]
>;IFN KLBOOT
BADUN2: PUSHJ P,TYPE
JRST 4,.
;⊗ ARGLST DTELOD DTELD1 DTEERR DTELD2 DTELD3 DTELD4 DTLD4A DTLD4B DTLD4D DTLD4E DTLD4F DTLD4G DTLD4C DTELD5 RMGRNK RMGRN1 RMGRN2 LX11 LX11LN Loop ERROR DONG LD11 LDLP ST11 R0 R1 R2 R3 R4 R5 SP PC BIT15 BIT14 BIT13 BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DTEORG DTESIZ DLYCNT DEXWD3 DEXWD2 DEXWD1 TENAD1 PRTOFF DEPOSI TENAD2 TO10BC TO11BC TO10AD TO11AD DIAG1 DIAG2 DRESET STATUS TO11DB TO10DB TO11DN DEXDON TO11ER DIAG3 EPT143 . STBOOT 1$ Loop LOOP DISP ERROR DONG LD11 9$ 1$ EXAM DEXGO DEXWAT DEPO ERCMD CMDLST ST11 . ST11 1$ 2$
IFN LOAD11,< ;code to reload the 11 after DSKDMP starts up
;This code is taken from KLSER (other code taken from 11LOAD).
Comment %
DTELOD UUO to force the console front end to be reloaded.
MOVEI AC,ARGLST
DTELOD AC,
<Failure - Code in AC>
<Ok. Hopefully the 11 is running>
ARGLST: User Address of Data to Load
Load Descriptor
. . .
Load Descriptor
Starting Address
-1
Each Load descriptor has the form: BYTE(4)4(16)TO11BC,TO11AD
The Starting Address command is: Byte(4)2(16)0,STRTAD
STRTAD and TO11AD are -11 addresses.
TO11BC is the To-11 Byte Count. Lower 12 bits contain the negative of
the number of WORDs to load. The high order bit is the flag INT10B,
which should be set, to make the DTE interrupt the 10 on completion of
a to-11 transfer.
The data to load is consecutive PDP-11 words, right adjusted in 18-bit
bytes (i.e., halfwords).
The byte count of a load descriptor is not allowed to imply any crossing
of a PDP-10 page boundary.
See 11LOAD[KL,SYS], the B and αX GRONK commands for an example of
how this works!
%
↑DTELOD:
MOVE TAC,JBTPRV(J)
TLNN TAC,DEVPRV
JRST UUOERR
XCTR XR,[MOVE TAC,(UCHN)]
XCTR XR,[MOVE TAC1,(TAC)] ;the address of the data
DTELD1: XCTR XR,[MOVE DAT,1(TAC)] ;a command word.
LDB AC2,[POINT 4,DAT,3] ;record type
CAIN AC2,2 ; 2 is start address.
JRST DTELD2 ;accept this command list.
CAIE AC2,4 ; 4 is a load command
JSP TAC,DTEERR ;Illegal fcn.
LDB AC2,[POINT 12,DAT,19] ;this records's negative word count
TRNE AC2,1 ;word count must be even
JSP TAC,DTEERR ;error if not
IOR AC2,[777777,,770000] ;extend the sign
ASH AC2,-1 ;down shift to make it words.
XCTR XR,[CAM (TAC1)] ;make sure we can touch user's page.
LDB AC3,[POINT 9,TAC1,26] ;page number from start address.
SUB TAC1,AC2 ;count words. TAC1←next xfer address
LDB AC1,[POINT 9,TAC1,26] ;page number from ending address.
CAMG AC1,AC3 ;have we crossed a page boundary?
AOJA TAC,DTELD1 ;nope. This is ok.
CAIN AC1,1(AC3) ;is this precisely one page higher?
TRNE TAC1,777 ;yes. Does count end with zeros?
JSP TAC,DTEERR ;bad data.
AOJA TAC,DTELD1
DTEERR: PUSHJ P,STOTAC ;RETURN ERROR CODE TO USER.
PUSHJ P,SETEBR
SETZM TO11BP(TAC1) ;CLEAR BYTE POINTER TO PREVENT IOPGF
POP P,TAC1
MOVEI TAC1,DTEEXP
PUSHJ P,DELEMP ;delete DTE page from Exec Page table
JRST DTEIN2 ;Give DTE a PIA again
DTELD2: SETOM RLOD11 ;mark we are futzing 11
PUSHJ P,RMGRNK ;Gronk the 11's Rom. Load first loader.
JRST DTEERR ;didn't work. return error code
SETO DDB, ;page number of user page mapped to DTEEXP
XCTR XR,[MOVE TAC,(UCHN)]
XCTR XR,[MOVE TAC1,(TAC)] ;the address of the data
DTELD3: XCTR XR,[MOVE DAT,1(TAC)] ;a command word.
LDB AC2,[POINT 4,DAT,3] ;record type
CAIN AC2,2 ; 2 is start address.
JRST DTELD5 ;go start the 11.
CAIE AC2,4 ; 4 is a load command
JSP TAC,DTEERR ;Illegal fcn.
LDB AC2,[POINT 12,DAT,19] ;this records's word count
TRNE AC2,1 ;byte count must be even
JSP TAC,DTEERR ;error if not
IOR AC2,[777777,,770000] ;extend the sign
ASH AC2,-1 ;down shift to make it words.
XCTR XR,[CAM (TAC1)] ;make sure we can touch user's page.
MOVE DSER,TAC1 ;remember start of this xfer.
LDB AC3,[POINT 9,TAC1,26] ;page number from start address.
SUB TAC1,AC2 ;count words. TAC1←next xfer address
LDB AC1,[POINT 9,TAC1,26] ;page number from ending address.
CAMG AC1,AC3 ;have we crossed a page boundary?
JRST DTELD4 ;nope. This is ok.
CAIN AC1,1(AC3) ;is this precisely one page higher?
TRNE TAC1,777 ;yes. Does count end with zeros?
JSP TAC,DTEERR ;bad data.
DTELD4: PUSH P,TAC ;This is popped at DTLD4E
MOVE IOS,TAC ;copy in case of error.
CAMN AC3,DDB ;Same user page as last time?
JRST DTLD4B ;Yes.
PUSH P,TAC1
JUMPL DDB,DTLD4A ;jump if no old page to unmap.
MOVEI TAC1,DTEEXP ;unmap the page from DTEEXP
PUSHJ P,DELEMP ;delete DTE page from Exec Page table
DTLD4A: MOVE DDB,AC3 ;user's page to map
IFE FTMPP2,<
.FATAL /Write something here/
>;IFE FTMPP2
IFN FTMPP2,<
MOVE J,JOB
MOVEI AC1,DTEEXP ;EXEC VIRTUAL PAGE TO GET UPMP
PUSHJ P,JOBEVP
JFCL
>;IFN FTMPP2
HRRZ AC3,DTEPAD(DDB) ;physical page number of user's page
MOVEI TAC1,DTEEXP
PUSHJ P,DELEMP ;delete user's map from exec space
MOVE TAC,AC3 ;physical page to map
PUSHJ P,ADDEMP
POP P,TAC1
DTLD4B: MOVEI AC3,DTEEXP ;set exec's page number
DPB AC3,[POINT 9,DSER,26] ;in transfer address
HRLI DSER,442200 ;18-bit bytes.
PUSHJ P,SETEBR ;pushes TAC1.
MOVEM DSER,TO11BP(TAC1)
MOVEM DAT,EPT143(TAC1)
MOVSI AC1,10
DTLD4D: SKIPN TAC,EPT143(TAC1) ;HAVE THEY Started YET?
JRST DTLD4E ;YES!
CAMN TAC,[BYTE(4)0(16)177777,177777] ;Is the 11 grumpy?
JSP TAC,DTLD4C ;yes. exit now.
CAME DAT,TAC ;did the 11 change it somehow?
JSP TAC,DTLD4C ;yes, but not to what we thought.
SOJGE AC1,DTLD4D
JSP TAC,DTLD4C ;timeout waiting for 11 response
DTLD4E: MOVSI AC1,10
DTLD4F: SKIPE TAC,EPT143(TAC1) ;is the 11 done yet
JRST DTLD4G
SOJGE AC1,DTLD4F
JSP TAC,DTLD4C ;timeout waiting for transfer finish
DTLD4G: CAME TAC,[177777] ;success code?
JSP TAC,DTLD4C ;no. must be an error.
SETZM TO11BP(TAC1) ;make sure no more bytes fly past
POP P,TAC1
POP P,TAC
AOJA TAC,DTELD3
DTLD4C: SETZM TO11BP(TAC1)
SUB P,[2,,2] ;remove TAC, TAC1 from stack
HRL TAC,IOS ;user index,,error pc to TAC
JRST DTEERR
;time now to start the 11.
DTELD5: MOVEI TAC1,DTEEXP
PUSHJ P,DELEMP ;delete DTE page from Exec Page table
PUSHJ P,SETEBR ;pushes TAC1
SETZM TO11BP(TAC1)
MOVEM DAT,EPT143(TAC1)
MOVSI AC1,10
SKIPL EPT143(TAC1) ;wait for the -11 to store -1 here
SOJGE AC1,.-1
POP P,TAC1 ;unpush from setebr
SKIPGE AC1
JSP TAC,DTEERR
PUSHJ P,DTEIN2 ;Give DTE a PIA again
SETZM RSXIO ;assume we didn't load 11 with RSX
JRST CPOPJ1
;⊗ RMGRNK RMGRN1 RMGRN2
RMGRNK: DATAO DTE0,[0] ;clear TO-10 byte count.
CONO DTE0,PIENB ;Turn off PI's and reset DTE.
PUSHJ P,SETEBR ;TAC1←address of KL's EPT.
SUB P,[1,,1] ;SETEBT pushes TAC1; flush it
SETZM EPT143(TAC1) ;Set to idle before ROM Gronk
SETZM TO10BP(TAC1) ;clear assorted byte pointers
SETZM TO11BP(TAC1)
CONO DTE0,SR11B!PIENB!PI0ENB ;Set reload and PI0 enable.
MOVSI TAC,1
CONSO DTE0,DEAD11
SOJGE TAC,.-1
SKIPGE TAC
JSP TAC,[CONO DTE0,CR11B
POPJ P,] ;return. error code in TAC
MOVEI TAC,500000 ;(for KL10A, 400000 was long enough)
SOJGE TAC,. ;leave it dead for a while.
CONO DTE0,CR11B ;release reload button
MOVSI TAC,1
CONSZ DTE0,DEAD11
SOJGE TAC,.-1
SKIPGE TAC
JSP TAC,CPOPJ ;return. error code in TAC
CONO DTE0,DONG11!DONG10 ;Clear To-10 Bell. Set To-11 Bell.
DATAO DTE0,[1365] ;a constant from the M873YD ROM
MOVSI TAC,1
CONSZ DTE0,DONG11 ;wait for 11 to clear its bell
SOJGE TAC,.-1
SKIPGE TAC
JSP TAC,CPOPJ ;return. error code in TAC
;At this point, the 11 is properly gronked. The 11 is now willing to
;barf up as much as 28K -11 words worth of crud in case you want some.
;We must convince the 11 that we don't want any!
;The DTE has been gronked via diagnostic reset. Then the TO10AD was
;set to zero. All you need to do is setup a TO10BP and TO10BC and
;you can have his carcase.
;
; The 11 will wait until we ring the bell.
;we must have a byte pointer, etc. setup when we ring.
MOVE TAC,[POINT 18,LX11] ;
MOVEM TAC,TO11BP(TAC1) ;store to-11 byte pointer.
MOVSI TAC,1
SOJGE TAC,.
CONO DTE0,DONG11 ;notify the 11 to swallow things.
MOVSI TAC,10
CONSO DTE0,TO11DN!TO11ER!DONG10
SOJGE TAC,.-1
SKIPGE TAC
JSP TAC,CPOPJ ;return. error code in TAC
CONO DTE0,DONG11
MOVSI TAC,1
RMGRN1: CONSO DTE0,DONG11
JRST RMGRN2 ;DTE has had final reset.
CONSO DTE0,DONG10
SOJGE TAC,RMGRN1
JSP TAC,CPOPJ ;set error code in TAC
RMGRN2: SETZM TO11BP(TAC1)
JRST CPOPJ1
;⊗ LX11 LX11LN Loop ERROR DONG LD11 LDLP ST11 R0 R1 R2 R3 R4 R5 SP PC BIT15 BIT14 BIT13 BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 DTEORG DTESIZ DLYCNT DEXWD3 DEXWD2 DEXWD1 TENAD1 PRTOFF DEPOSI TENAD2 TO10BC TO11BC TO10AD TO11AD DIAG1 DIAG2 DRESET STATUS TO11DB TO10DB TO11DN DEXDON TO11ER DIAG3 EPT143 . STBOOT 1$ Loop LOOP DISP ERROR DONG LD11 9$ 1$ EXAM DEXGO DEXWAT DEPO ERCMD CMDLST ST11 . ST11 1$ 2$
;The following is the second bootstrap loader for the 11.
;The first bootstrap loader (the M873YD) is activated by the RELOAD11 button
;in the DTE-20.
;The first bootstrap allows the 400-byte second loader to be moved to
;locations 0:377 in the -11, and started at zero.
;To build a new second loader, edit the PALX program shown in the comment below.
;extract that file into a PAL file. Create a BIN file using PALX.
;Use the 11LOAD[KL,SYS] program:
; N command to load the BIN file without symbols
; C command to write the result as halfword octal into a text file
;Finally, move that text file to here.
LX11:
240,,403 ;0
10,,340 ;4
0,,12700 ;10
1000,,5020 ;14
22700,,160000 ;20
1374,,12705 ;24
174400,,12706 ;30
746,,12765 ;34
37777,,0 ;40
12702,,344 ;44
12765,,100 ;50
32,,4467 ;54
204,,16500 ;60
6,,42700 ;64
177760,,32700 ;70
11,,1006 ;74
170,,104 ;100
50,,746 ;104
162,,114 ;110
10246,,12702 ;114
336,,16522 ;120
6,,16522 ;124
4,,16512 ;130
2,,12602 ;134
4467,,150 ;140
0,,177777 ;144
177777,,12765 ;150
400,,34 ;154
733,,16500 ;160
4,,16501 ;164
2,,10022 ;170
10122,,22702 ;174
726,,101002 ;200
12702,,344 ;204
4467,,100 ;210
0,,0 ;214
0,,10165 ;220
22,,10065 ;224
16,,32765 ;230
4202,,34 ;234
1774,,32765 ;240
200,,34 ;244
1721,,4467 ;250
36,,0 ;254
0,,177777 ;260
732,,12765 ;264
4000,,10 ;270
12765,,143 ;274
12,,32765 ;300
4004,,34 ;304
1774,,204 ;310
12703,,10 ;314
60503,,12713 ;320
14000,,12443 ;324
12443,,12443 ;330
757,,0 ;334
0,,0 ;340
0,,0 ;344
0,,0 ;350
0,,0 ;354
0,,0 ;360
0,,0 ;364
0,,0 ;370
0,,0 ;374
0,,0 ;400
0,,0 ;404
0,,0 ;410
0,,0 ;414
0,,0 ;420
0,,0 ;424
0,,0 ;430
0,,0 ;434
0,,0 ;440
0,,0 ;444
0,,0 ;450
0,,0 ;454
0,,0 ;460
0,,0 ;464
0,,0 ;470
0,,0 ;474
0,,0 ;500
0,,0 ;504
0,,0 ;510
0,,0 ;514
0,,0 ;520
0,,0 ;524
0,,0 ;530
0,,0 ;534
0,,0 ;540
0,,0 ;544
0,,0 ;550
0,,0 ;554
0,,0 ;560
0,,0 ;564
0,,0 ;570
0,,0 ;574
0,,0 ;600
0,,0 ;604
0,,0 ;610
0,,0 ;614
0,,0 ;620
0,,0 ;624
0,,0 ;630
0,,0 ;634
0,,0 ;640
0,,0 ;644
0,,0 ;650
0,,0 ;654
0,,0 ;660
0,,0 ;664
0,,0 ;670
0,,0 ;674
0,,0 ;700
0,,0 ;704
0,,0 ;710
0,,0 ;714
0,,0 ;720
0,,0 ;724
0,,0 ;730
0,,0 ;734
0,,0 ;740
0,,16500 ;744
2,,4467 ;750
177336,,17 ;754
177777,,177777 ;760
5001,,5021 ;764
22701,,770 ;770
1374,,110 ;774
LX11LN==.-LX11
BLOCK 200-LX11LN ;MUST HAVE these zeros here. Sorry.
COMMENT π
.TITLE DTBOOT
Comment ⊗
Here is the text of the DTBOOT program.
This program is loaded into the first 1000 bytes of the -11 by the action
of the KL10 and the M873YD loader. The function of the DTBOOT program
is to:
Clear -11 core from 1000 to 157777
Loop: Diagnostic Clear to DTE
Examine EPT location 143.
If DEXWD1 AND '17 is zero, go to loop. These are bits 0:3 of EPT 143.
If DEXWD1 AND '17 are 2, go to ST11.
If DEXWD1 AND '17 are 4, go to LD11.
Otherwise, go to ERROR
ERROR: (save offending command in ERCMD)
deposit BYTE(4)0(32)-1 in EPT 143.
DONG: DONG 10.
Go to loop.
LD11: Set TO11BC from DEXWD2
Set TO11AD from DEXWD3
(Save DEXWD2 and DEXWD3 in the buffer at CMDLST)
LDLP: If NOT(TO11DN or TO11EE or TO11DB) then go to LDLP.
IF NOT TO11DN Then go to ERROR.
Deposit zero in EPT 143.
Go to DONG
ST11: Copy DEXWD3 to R0.
Deposit -1 in EPT 143.
Clear as much of the region from 0 to 1000 as we can.
DO JMP (R0).
⊗
R0=%0
R1=%1
R2=%2
R3=%3
R4=%4
R5=%5
SP=%6
PC=%7
BIT15=100000
BIT14= 40000
BIT13= 20000
BIT12= 10000
BIT11= 4000
BIT10= 2000
BIT9= 1000
BIT8= 400
BIT7= 200
BIT6= 100
BIT5= 40
BIT4= 20
BIT3= 10
BIT2= 4
BIT1= 2
BIT0= 1
;DTE REGISTERS
DTEORG=174400 ;origin of the four DTE's
DTESIZ=40 ;number of bytes associated with DTE registers
DLYCNT=00 ;offsets from DTEORG addresses
DEXWD3=02 ;Bits 20:35 of the KL10 word
DEXWD2=04 ;Bits 4:19 of the KL10 word
DEXWD1=06 ;Bits 0: 3 of the KL10 word
TENAD1=10
PRTOFF=BIT11 ;set for priviledged examine
DEPOSI=BIT12 ;set for deposit
TENAD2=12 ;Bits 20:25 of the KL10 address
TO10BC=14
TO11BC=16
TO10AD=20
TO11AD=22
DIAG1=30
DIAG2=32
DRESET=BIT6 ;diagnostic reset
STATUS=34
TO11DB=BIT11 ;To-11 doorbell
TO10DB=BIT8 ;to-10 doorbell
TO11DN=BIT7 ;to-11 done
DEXDON=BIT2 ;deposit/examine done
TO11ER=BIT1 ;to-11 error
DIAG3=36
EPT143=143 ;a magic location in the EPT, known to the DTBOOT loader.
.=0
STBOOT: NOP ;M873YD insists we start with NOP at 0
BR 12 ;
.WORD 10 ;4: BUS Timeout traps to 10
.WORD 340 ;6: PS for timeout
.WORD 0 ;10: HALT
;location 12 ;Clear -11 core from 1000 to 157777
MOV #1000,R0 ;Clear 11-Memory. Start at 1000.
1$: CLR (R0)+ ;Clear a word. Incr R0.
CMP #160000,R0 ;Compare R0, next wd to zero, to +INF.
BNE 1$ ;branch if more left to zero
MOV #DTEORG,R5 ;R5 is base address of relevant DTE.
MOV #ST11,SP ;ST11 is the address above stack
MOV #37777,DLYCNT(R5) ;Set the delay count in the DTE
MOV #CMDLST,R2 ;address to store commands
Comment ⊗
Loop: Diagnostic Clear to DTE
Examine EPT location 143.
If DEXWD1 AND '17 is zero, go to loop. These are bits 0:3 of EPT 143.
If DEXWD1 AND '17 are 2, go to ST11.
If DEXWD1 AND '17 are 4, go to LD11.
Otherwise, deposit BYTE(4)0(32)-1 in EPT 143. DONG 10. Go to loop.
⊗
LOOP: MOV #DRESET,DIAG2(R5) ;Diagnostic reset.
JSR R4,EXAM ;examine EPT 143.
MOV DEXWD1(R5),R0 ;get high order 4 bits of -10 word.
BIC #177760,R0 ;clear all but 4 bits.
BIT #11,R0 ;low-order bit is a badness.
BNE ERROR ;lose if low order bit is set.
JMP @DISP(R0) ;dispatch
DISP: .WORD LOOP ;0 No operation
.WORD ST11 ;2 Start 11
.WORD LD11 ;4 Load 11
.WORD ERROR ;6 Error - Undefined.
ERROR: MOV R2,-(SP) ;stack R2, command buffer pointer
MOV #ERCMD,R2 ;buffer for erroneous command
MOV DEXWD1(R5),(R2)+ ;save erroneous command
MOV DEXWD2(R5),(R2)+
MOV DEXWD3(R5),(R2)
MOV (SP)+,R2 ;restore R2 from stack.
JSR R4,DEPO ;deposit 4 bits of zero, and 32 ones
.word 0
.word 177777
.word 177777
DONG: MOV #TO10DB,STATUS(R5) ;THUMP THUMP.
BR LOOP
LD11: MOV DEXWD2(R5),R0 ;Copy DEXWD2 for the TO11 Byte Count
MOV DEXWD3(R5),R1 ;Copy DEXWD3 for the TO11 Address
MOV R0,(R2)+ ;store commands in command buffer
MOV R1,(R2)+
CMP #ST11-20,R2
BHI 9$ ;branch unless cmd buffer ovflow
MOV #CMDLST,R2
9$: JSR R4,DEPO ;Deposit zero to ACK the -10.
.WORD 0 ;We are starting the xfer
.WORD 0
.WORD 0
MOV R1,TO11AD(R5) ;store the TO-11 address
MOV R0,TO11BC(R5) ;store the byte count and GO!
1$: BIT #TO11DN!TO11DB!TO11ER,STATUS(R5) ;wait for done or error
BEQ 1$ ;or for the -10 to grump.
BIT #TO11DN,STATUS(R5) ;was it normal termination?
BEQ ERROR ;go grump at the -10
JSR R4,DEPO ;Deposit code. Transfer complete
.WORD 0
.WORD 0
.WORD 177777
BR DONG
;SUBRS for examine and deposit into EPT 143. Call with JSR R4,
EXAM: MOV #PRTOFF,TENAD1(R5) ;subr to examine EPT143.
DEXGO: MOV #EPT143,TENAD2(R5) ;start examine.
DEXWAT: BIT #TO11DB!DEXDON,STATUS(R5) ;wait for DEXDON or Bell.
BEQ DEXWAT
RTS R4
DEPO: MOV #TENAD1,R3 ;
ADD R5,R3 ;address of TENAD1
MOV #PRTOFF!DEPOSI,(R3) ;deposit TENAD1
MOV (R4)+,-(R3) ;deposit DEXWD1
MOV (R4)+,-(R3) ;deposit DEXWD2
MOV (R4)+,-(R3) ;deposit DEXWD3
BR DEXGO
ERCMD: .WORD 0,0,0 ;store erroneous from -10 command.
CMDLST: .WORD 0 ;here begins the list of saved commands
Comment ⊗
;Here to start the -11 from the address given in DEXWD3
ST11: Copy DEXWD3 to R0.
Deposit -1 in EPT 143.
Clear as much of the region from 0 to 1000 as we can.
DO JMP (R0).
⊗
.=1000-<15*2>
ST11: MOV DEXWD3(R5),R0 ;R0 ← Starting address of 11 PGM.
JSR R4,DEPO ;deposit -1 for the -10.
.word 17
.word 177777
.word 177777
CLR R1 ;try to vanish. Start at zero
1$: CLR (R1)+ ;and clear until
2$: CMP #2$,R1 ;we clear the CLR instruction.
BNE 1$ ;leaving 4 words untouched.
JMP (R0)
.END STBOOT
π
>;IFN LOAD11
>;IFN RHDSK
;⊗ FF
;XLIST ;LIT and VAR listing suppressed here
LIT
VAR
LIST ;resume listing
FF←←.
IFE DEBSW,<
IFN DSKDSW,<
IFN CSAVE,<
;Specify the starting address in the CSAVE file. This word occurs
;after the first (and only) IOWD has just run out. This is where
;the next IOWD would be.
JRST RSXGO ;in place of IOWD, specifies the starting address
>;IFN CSAVE
>;IFN DSKDSW
>;IFE DEBSW
;; Nota bene: Code beyond here (FF) won't be loaded during booting.
;⊗ CSVNAM CSVLEN CS MKCSAV NODSK NOENT NOOUT
;; Nota bene: Code here and beyond won't be loaded during booting.
;; This code runs from REENTER monitor command to generate a
;; bootable CSAVE file to be put on front end file system.
;; This code is basically run only once, on a WAITS job.
IFE DEBSW,<
IFN DSKDSW,<
IFN RHDSK,<
IFN CSAVE,<
DEPHASE ;undo the PHASE statement -- this code run on a WAITS job
CSVNAM: 'DSKDMP'
'EXE ' ;TOPS-20 likes to call the CSAVE file .EXE
0
0 ;write it on user's alias directory
CSVLEN←FF-LOWEST ;number of words of program to be booted by 11
CS←←1 ;I/O channel for writing out CSAVE file.
;Write out a CSAVE file (DSKDMP.CSV) which can be put on the front-end 11's
;file system for booting directly from the 11, without use of DECtapes.
;The file is written on the user's current (alias) directory.
;Any previous file is overwritten without checking (since the CSAVE file is
;only actively used on the front end file system, not from WAITS file system).
MKCSAV: MOVE D,[CSVNAM,,A]
BLT D,D ;set up enter block for CSAVE file
INIT CS,17 ;dump mode
'DSK '
0
JRST NODSK
ENTER CS,A ;Write the CSAVE file
JRST NOENT
OUT CS,[IOWD CSVLEN+2,CSVFIL ↔ 0] ;the 2 extra words written are:
CAIA ; IOWD at CSVFIL and JRST DSKDMP at FF
JRST NOOUT
RELEAS CS,
EXIT
NODSK: OUTSTR [ASCIZ/Can't INIT the DSK.
/]
HALT .
NOENT: OUTSTR [ASCIZ/ENTER failed.
/]
HALT .
NOOUT: OUTSTR [ASCIZ/OUT uuo failed.
/]
HALT .
>;IFN CSAVE
>;IFN RHDSK
>;IFN DSKDSW
>;IFE DEBSW
; END ;⊗
IFN DSKDSW,<
IFE DEBSW,<
END DSKDMP
>;IFE DEBSW
IFN DEBSW,<
END 300
>;IFN DEBSW
>;IFN DSKDSW
IFE DSKDSW,<
IFE KLBOOT,<
IFN DEBSW,<
END BOOT
>;IFN DEBSW
IFE DEBSW,<
END PNCHGO
>;IFE DEBSW
>;IFE KLBOOT
IFN KLBOOT,<
END BOOT
>;IFN KLBOOT
>;IFE DSKDSW